版权声明: https://blog.csdn.net/blackneed/article/details/81699652
Ocean的礼物
Time Limit: 5 s Memory Limit: 128 MB
Submit My Status
Problem Description
皇家理工存在一段很神奇的路段,这段路由nn个格子组成,每个格子都有一个数字,你可以走这段路的任意一段。这段路的神奇之处就在于,如果你所处的这个格子数字和你经过的前一个格子数字不相同的话,你就可以获得一个礼物(初始一定可以获得礼物)。现在Ocean想知道,给定任意路段的左边界和右边界,问若走这段路可以获得多少礼物。不过幸运的是,Ocean很快就解决了,并且获得了大量的礼物。玩的十分开心。但是有一天,这段路神奇的发生了改变。它不但会给你礼物。它还可能随时的改变其任意某处的格子上的数字。这下Ocean可就犯愁了,他想知道任意一段路可以获得的礼物是多少。聪明的你可以帮下他吗?
Input
第一行输入一个整数nn,代表格子数。(1≤n≤106)(1≤n≤106)
第二行输入nn个整数xx。(1≤x≤108)(1≤x≤108)
第三行输入一个整数mm,代表mm次操作。(1≤m≤2∗105)(1≤m≤2∗105)
接下来第四行到3+m3+m行每行33个数op,x,yop,x,y。
若op=1op=1则把xx处的数修改为yy。(1≤x≤n,1≤y≤108)(1≤x≤n,1≤y≤108)
若op=2op=2,询问区间[x,y][x,y]内可以获得的礼物数。(1≤x≤y≤n)(1≤x≤y≤n)
Output
对于每个询问输出一个整数,代表可以获得的礼物数
Sample Input
6 1 2 3 4 5 6 4 2 1 6 1 2 3 2 2 3 2 3 4
Sample Output
6 1 2
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 1e6 + 5;
struct node{
int value;
int visr;
int visl;
}tree[MAXN<<2];
int n,m,x,y,q;
void Pushup(int re)
{
tree[re].value=tree[re<<1].value+tree[re<<1|1].value;
tree[re].visl=tree[re<<1].visl;
tree[re].visr=tree[re<<1|1].visr;
if(tree[re<<1].visr==tree[re<<1|1].visl) tree[re].value--;
}
void BuildTree(int i,int left,int right){
if(left == right){
scanf("%d",&tree[i].visl);
tree[i].visr = tree[i].visl;
tree[i].value = 1;
return;
}
int mid = left+right>>1;
BuildTree(i<<1,left,mid);
BuildTree(i<<1|1,mid+1,right);
Pushup(i);
}
void Update(int i,int left,int right,int pos,int val){
if(left ==right){
tree[i].visr = val;
tree[i].visl = val;
return;
}
int mid = left+right>>1;
if(pos<=mid) Update(i<<1,left,mid,pos,val);
else Update(i<<1|1,mid+1,right,pos,val);
Pushup(i);
}
int Query(int i,int l,int r,int L,int R){
if(L<=l && R>=r) return tree[i].value;
int ans=0,mid=l+r>>1;
if(L<=mid) ans+=Query(i<<1,l,mid,L,R);
if(R>mid) ans+=Query(i<<1|1,mid+1,r,L,R);
if(L<=mid && R>mid && tree[i<<1].visr==tree[i<<1|1].visl) ans--;
return ans;
}
int main()
{
int n,m,q,y,l,r;
scanf("%d",&n);
BuildTree(1,1,n);
scanf("%d",&m);
while(m--){
scanf("%d%d%d",&q,&x,&y);
if(q==1) Update(1,1,n,x,y);
else printf("%d\n",Query(1,1,n,x,y));
}
return 0;
}