P5057 [CQOI2006]简单题

链接: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 }
Ac
原文地址:https://www.cnblogs.com/For-Miku/p/11248959.html