线段树求调(lazy tag好像有问题)
  • 板块P1558 色板游戏
  • 楼主jikky
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/9 10:45
  • 上次更新2024/10/9 16:39:41
查看原帖
线段树求调(lazy tag好像有问题)
1382982
jikky楼主2024/10/9 10:45
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e6+10;
int n,c,q;

struct T{
	int sum;
	int l,r;
	int lazy;
}t[N<<1];

void up(int k){
	t[k].sum=t[k<<1].sum|t[k<<1|1].sum;
}

void build(int k,int l,int r){
	t[k].l=l;
	t[k].r=r;
	if(l==r){
		t[k].sum=1;
		t[k].lazy=0;
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	up(k);
}

void ch(int k,int l,int r,int x){
	if(t[k].l>=l&&t[k].r<=r){
		t[k].sum=(1ll<<(x-1));
		t[k].lazy=(1ll<<(x-1));
		return;
	}
	int mid=(t[k].l+t[k].r)>>1;
	if(l<=mid){
		ch(k<<1,l,r,x);
	}
	if(r>mid){
		ch(k<<1|1,l,r,x);
	}
	up(k);
	return;
}

void down(int k){
	t[k<<1].lazy=t[k].lazy;
	t[k<<1|1].lazy=t[k].lazy;
	t[k<<1].sum=t[k].lazy;
	t[k<<1|1].sum=t[k].lazy;
	t[k].lazy=0;
}

int ask(int k,int l,int r){
	if(t[k].l>=l&&t[k].r<=r){
		down(k);
		return t[k].sum;
	}
	if(t[k].lazy){
		down(k);
	}
	int mid=(t[k].l+t[k].r)>>1;
	int v=0;
	if(l<=mid){
		v=ask(k<<1,l,r);
	}
	if(r>mid){
	    v=v|(ask(k<<1|1,l,r));	
	}
	
	return v;
}

signed main(){
	cin>>n>>c>>q;
	build(1,1,n);
	for(int i=1;i<=q;i++){
		char a;
		cin>>a;
		if(a=='C'){
			int l,r,x;
			cin>>l>>r>>x;
			if(l>r){
				swap(l,r);
			}
			ch(1,l,r,x);
		}
		else{
			int l,r;
			cin>>l>>r;
			if(l>r){
				swap(l,r);
			}
			int o=ask(1,l,r);
			int cnt=0;
			//cout<<o<<endl;
			for(int j=(1ll<<29);j;j=j>>1){
				if((o&j)==j){
					cnt++;
				}
			}
			cout<<cnt<<'\n';
		}
	}
	return 0;
}


2024/10/9 10:45
加载中...