POJ 2777

这道题一直很奇怪的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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值