一开始总是TLE。。。偶然看到discuss里面有人说用cin就会TLE。然后我用
char cp;
scanf("%c",&cp);
不知道为什么while(O--)的次数有问题了,再没有输入'C'或'P'时也会有循环。后来仿照网上的解法,用
char cp[10];
scanf("%s", cp);
具体原因有待研究。。。
还有一个疑惑就是为什么要开4倍大小的空间?
#include <iostream>
using namespace std;
#define maxn 100010
struct node
{
int l,r;
int c;
int lazy;
}T[maxn*4];
void construct(int l,int r,int k)
{
if(l==r)
{
T[k].l=l;
T[k].r=r;
return;
}
else
{
T[k].l=l;
T[k].r=r;
int m=(l+r)>>1;
construct(l,m,2*k);
construct(m+1,r,2*k+1);
}
}
void update(int l,int r,int k,int c)
{
if(l<=T[k].l && r>=T[k].r)
{
T[k].c=c;
T[k].lazy=1;
return;
}
if(T[k].lazy==1)
{
if(T[k].c==c)
return;
T[k].lazy=0;
T[k<<1].c=T[k].c;
T[k<<1|1].c=T[k].c;
T[k<<1].lazy=1;
T[k<<1|1].lazy=1;
}
int m=(T[k].l+T[k].r)>>1;
if(r<=m)
update(l,r,k<<1,c);
else if(l>m)
update(l,r,k<<1|1,c);
else
{
update(l,m,k<<1,c);
update(m+1,r,k<<1|1,c);
}
T[k].c=T[2*k].c|T[2*k+1].c;
}
int search(int l,int r,int k)
{
if(T[k].lazy==1)
return T[k].c;
if(l==T[k].l && r==T[k].r)
return T[k].c;
int m=(T[k].l+T[k].r)>>1;
if(r<=m)
return search(l,r,k<<1);
else if(l>m)
return search(l,r,k<<1|1);
else
{
int i=search(l,m,k<<1);
i=i|search(m+1,r,k<<1|1);
return i;
}
}
void swap(int &x,int &y)
{
int temp=x;
x=y;
y=temp;
}
int calculate_1(int x)
{
int cal=0;
while(x)
{
cal+=x&1;
x>>=1;
}
return cal;
}
int main()
{
int L,MaxC,O;
scanf("%d%d%d",&L,&MaxC,&O);
construct(1,L,1);
T[1].c=1;
T[1].lazy=1;
while(O--)
{
/*char cp;
scanf("%c",&cp);*/
char cp[10];
scanf("%s", cp);
int a1,a2,a3,color;
if(!strcmp(cp,"C"))
{
scanf("%d%d%d",&a1,&a2,&a3);
if(a1>a2)
swap(a1,a2);
color=1<<(a3-1);
update(a1,a2,1,color);
}
if(!strcmp(cp,"P"))
{
scanf("%d%d",&a1,&a2);
a3=0;
if(a1>a2)
swap(a1,a2);
int result=search(a1,a2,1);
cout<<calculate_1(result)<<endl;
}
}
return 0;
}