1 solutions

  • 0
    @ 2023-12-5 23:22:45

    难度:

    算法: 线段树,树状数组

    首先,建一个线段树。维护区间加,以及查询单点。

    对于修改操作,我们可以把对应的区间每个数 +1+1

    对于查询,我们查询该点的值,记为 uuuu 就是其被翻转的次数。如为奇数,则结果为 11,否则为 00

    #include<bits/stdc++.h>
    using namespace std;
    struct tr{
    	int ls,rs,sum,tag;
    };
    struct sgt{
    	tr f[400010];
    	int cnt;
    	void push_up(int u){
    		f[u].sum=f[f[u].ls].sum+f[f[u].rs].sum;
    	}
    	void push_down(int u){
    		f[u].sum+=f[u].tag;
    		f[f[u].ls].tag+=f[u].tag;
    		f[f[u].rs].tag+=f[u].tag;
    		f[u].tag=0;
    	}
    	int build(int le,int ri){
    		int u=++cnt,mid=(le+ri)/2;
    		if(le<ri){
    			f[u].ls=build(le,mid);
    			f[u].rs=build(mid+1,ri);
    		}
    		return u;
    	}
    	void upd(int u,int le,int ri,int x,int y,int c){
    		push_down(u);
    		if(x<=le&&ri<=y){
    			f[u].tag+=c;
    			return ;
    		}
    		int mid=(le+ri)/2;
    		if(x<=mid) upd(f[u].ls,le,mid,x,y,c);
    		if(y>mid) upd(f[u].rs,mid+1,ri,x,y,c);
    		push_up(u);
    	}
    	int que(int u,int le,int ri,int x,int y){
    		push_down(u);
    		if(x<=le&&ri<=y){
    			return f[u].sum;
    		}
    		int mid=(le+ri)/2;
    		int res=0;
    		if(x<=mid) res+=que(f[u].ls,le,mid,x,y);
    		if(y>mid) res+=que(f[u].rs,mid+1,ri,x,y);
    		return res;
    	}
    }t;
    int n,q,op,a,b;
    int main(){
    	scanf("%d%d",&n,&q);
    	t.build(1,n);
    	while(q--){
    		scanf("%d",&op);
    		if(op==1){
    			scanf("%d%d",&a,&b);
    			t.upd(1,1,n,a,b,1);
    		}
    		if(op==2){
    			scanf("%d",&a);
    			int w=t.que(1,1,n,a,a);
    			printf("%d\n",w%2);
    		}
    	}
    }
    
    • 1

    Information

    ID
    119
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    9
    Tags
    # Submissions
    10
    Accepted
    4
    Uploaded By