1 solutions
-
0
难度: 黄
算法: 线段树,树状数组
首先,建一个线段树。维护区间加,以及查询单点。
对于修改操作,我们可以把对应的区间每个数 。
对于查询,我们查询该点的值,记为 。 就是其被翻转的次数。如为奇数,则结果为 ,否则为 。
#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