P5057 [CQOI2006]简单题
----------------------------------
其实这道题是树状数组的模板题
---------------------------------
看一下题意,如果用树状数组,我们很容易想到差分数组。但是一般的差分数组是不行的
---------------------------------
因为只有零和一,所以对于每一次操作,实就是让它在0和1中循环。而且,很容易得到,对于一个点进行了奇数次操作,他就会被改变,而偶数次操作就不变,知道了这点,我们就可以用树状数组去维护了
-----------------------------------
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int t[1000001]; 5 int f; 6 int n,m; 7 int x;int y; 8 int lowbit(int x){ 9 return x & -x; 10 } 11 int sum(int x){ 12 int ans=0; 13 while(x){ 14 ans+=t[x]; 15 x-=lowbit(x); 16 } 17 return ans; 18 } 19 void add(int k,int x){ 20 while(k<=n){ 21 t[k]+=x; 22 k+=lowbit(k); 23 } 24 return ; 25 } 26 int main(){ 27 cin>>n>>m; 28 for(int i=1;i<=m;++i){ 29 cin>>f; 30 if(f==1){ 31 cin>>x>>y; 32 add(x,1); 33 add(y+1,-1); 34 } 35 else 36 { 37 cin>>y; 38 cout<<sum(y)%2<<endl; 39 } 40 } 41 return 0; 42 }