解析
- 简单的用树状数组或线段树处理,每次被修改的区间里的元素 +1 即可,最后判断这个点被修改奇数次还是偶数次即可
Code
法一(树状数组)
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
int n,m,ctr[100005];
int lowbit(int u)
{
return u&(-u);
}
void update(int u,int v)
{
for(;u<=n;u+=lowbit(u)) ctr[u]+=v;
return;
}
int query(int u)
{
int res=0;
for(;u;u-=lowbit(u)) res+=ctr[u];
return res;
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int opt;
scanf("%d",&opt);
if(opt==1)
{
int x,y;
scanf("%d%d",&x,&y);
update(x,1);
update(y+1,-1);
}
if(opt==2)
{
int x;
scanf("%d",&x);
printf("%d
",query(x)&1);
}
}
return 0;
}
法二(线段树)
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
int n,m;
struct Tree
{
struct tree
{
int val,tag;
}tr[400005];
void pushup(int root)
{
tr[root].val=tr[root*2].val+tr[root*2+1].val;
return;
}
void build(int root,int l,int r)
{
if(l==r)
{
tr[root].val=0;
return;
}
int mid=(l+r)>>1;
build(root*2,l,mid);
build(root*2+1,mid+1,r);
pushup(root);
return;
}
void pushdown(int root,int l,int r)
{
if(tr[root].tag)
{
int mid=(l+r)>>1;
tr[root*2].val+=(mid-l+1)*tr[root].tag;
tr[root*2+1].val+=(r-mid)*tr[root].tag;
tr[root*2].tag+=tr[root].tag;
tr[root*2+1].tag+=tr[root].tag;
tr[root].tag=0;
}
return;
}
void update(int root,int l,int r,int ll,int rr,int s)
{
if(ll<=l&&r<=rr)
{
tr[root].val+=(r-l+1)*s;
tr[root].tag+=s;
return;
}
pushdown(root,l,r);
int mid=(l+r)>>1;
if(mid>=ll) update(root*2,l,mid,ll,rr,s);
if(mid<rr) update(root*2+1,mid+1,r,ll,rr,s);
pushup(root);
return;
}
int query(int root,int l,int r,int ll,int rr)
{
if(ll<=l&&r<=rr) return tr[root].val;
pushdown(root,l,r);
int res=0,mid=(l+r)>>1;
if(mid>=ll) res+=query(root*2,l,mid,ll,rr);
if(mid<rr) res+=query(root*2+1,mid+1,r,ll,rr);
return res;
}
}str;
int main()
{
scanf("%d%d",&n,&m);
str.build(1,1,n);
while(m--)
{
int opt;
scanf("%d",&opt);
if(opt==1)
{
int x,y;
scanf("%d%d",&x,&y);
str.update(1,1,n,x,y,1);
}
if(opt==2)
{
int x;
scanf("%d",&x);
printf("%d
",str.query(1,1,n,x,x)&1);
}
}
return 0;
}