这道题一直很奇怪的RE,把数组大小从4倍改成2倍,3倍仍然RE,然后改成5倍,还是RE,最后改成6倍,居然AC了。不懂为啥大佬的数组开4倍可以过。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int tree[600040];
int laz[600040];
char c;
void change(int node,int L,int R,int l,int r,int col){
if(R<l||L>r)return;
if(laz[node]){
tree[node*2]=1<<(laz[node]-1);
tree[node*2+1]=1<<(laz[node]-1);
laz[node*2]=laz[node];
laz[node*2+1]=laz[node];
laz[node]=0;
}
if(L==R||L==l&&R==r){
tree[node]=1<<(col-1);
if(L!=R)laz[node]=col;
return;
}
int mid=(L+R)/2;
if(mid>=r)change(node*2,L,mid,l,r,col);
else if(mid<l)change(node*2+1,mid+1,R,l,r,col);
else{
change(node*2,L,mid,l,mid,col);
change(node*2+1,mid+1,R,mid+1,r,col);
}
tree[node]=tree[node*2]|tree[node*2+1];
}
int query(int node,int L,int R,int l,int r){
if(R<l||L>r)return 0;
if(laz[node]){
tree[node*2]=1<<(laz[node]-1);
tree[node*2+1]=1<<(laz[node]-1);
laz[node*2]=laz[node];
laz[node*2+1]=laz[node];
int t=1<<(laz[node]-1);
laz[node]=0;
return t;
}
if(L==R||L==l&&R==r)
return tree[node];
int mid=(L+R)/2;
if(mid>=r)return query(node*2,L,mid,l,r);
if(mid<l)return query(node*2+1,mid+1,R,l,r);
return query(node*2,L,mid,l,mid)|query(node*2+1,mid+1,R,mid+1,r);
}
int main(){
int a,b,t,s,n,m,col,cas,ans;
while(scanf("%d%d%d",&n,&m,&cas)==3){
memset(tree,0,sizeof(tree));
memset(laz,0,sizeof(laz));
change(1,1,n,1,n,1);
while(cas--){
scanf("\n%c",&c);
if(c=='C'){
scanf("%d%d%d",&a,&b,&col);
if(a>b)
{s=a;
a=b;
b=s;
}change(1,1,n,a,b,col);
}
else{
scanf("%d%d",&a,&b);
if(a>b)
{s=a;
a=b;
b=s;
}t=query(1,1,n,a,b);
ans=0;
while(t){
if(t%2==1)ans++;
t/=2;
}
printf("%d\n",ans);
}
}
}
return 0;
}