题目:LightOJ 1080 Binary Simulation
这个题也很有意思。常规来说应该是用线段树做吧?不过我选的做法是树状数组。
一般树状数组都是单点更新,区间查询。但是这个区间更新,单点查询也可以。具体原理怎么回事我不太明白,所以先贴一下。
这个题是记录次数,翻转为偶数次的就不变,为奇数次的翻转。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define Max 100000+10
char ch[100000+10],op[10];
int c[100000+10];
int lowbit(int x)
{
return x&(-x);
}
void add(int i,int val)
{
while(i<=Max)
{
c[i]+=val;
i+=lowbit(i);
}
}
int Sum(int i)
{
int s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
int main()
{
int T,q,a,b,kcase=1;
scanf("%d",&T);
while(T--)
{
memset(c,0,sizeof(c));
scanf("%s%d",ch,&q);
printf("Case %d:\n",kcase++);
while(q--)
{
scanf("%s",op);
if(op[0]=='I')
{
scanf("%d%d",&a,&b);
add(a,1);
add(b+1,-1);
}
else
{
scanf("%d",&a);
int tmp=Sum(a);
if(tmp&1)
printf("%d\n",!(ch[a-1]-'0'));
else
printf("%d\n",ch[a-1]-'0');
}
}
}
return 0;
}
另……等过段时间学了线段树再补另一种做法OTZ