线段树状压50ptsTLE一半求调
  • 板块P1558 色板游戏
  • 楼主rczong
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/25 13:08
  • 上次更新2024/10/25 15:37:59
查看原帖
线段树状压50ptsTLE一半求调
545037
rczong楼主2024/10/25 13:08

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e7;
int n,tt,m;
struct tree{
	int l,r,sum,tag; 
}t[N*4];
void build(int x,int l,int r){
	t[x].l=l;t[x].r=r;
	if(l==r){
		t[x].sum=1;
		t[x].tag=0;
		return;
	}
	int mid=(l+r)/2;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	t[x].sum=t[x<<1].sum|t[x<<1|1].sum;
}
void down(int x){
	t[x<<1].tag=t[x].tag;
	t[x<<1|1].tag=t[x].tag;
	t[x<<1].sum=t[x].tag;
	t[x<<1|1].sum=t[x].tag;
	t[x].tag=0;
}
int getsum(int x){
	int sum=0;
	while(x){
		sum+=x&1;
		x>>=1;
	}
	return sum;
}
int gettwo(int x){
	return pow(2,x-1);
}
void modify(int x,int l,int r,int k){
	if(t[x].l>r||t[x].r<l)return;
	if(t[x].l>=l&&t[x].r<=r){
		t[x].sum=k;
		t[x].tag=k;
	}
	if(t[x].tag)down(x);
	int mid=(t[x].l+t[x].r)/2;
	if(l<=mid)modify(x<<1,l,r,k);
	if(r>mid)modify(x<<1|1,l,r,k);
	t[x].sum=t[x<<1].sum|t[x<<1|1].sum;
}
int query(int x,int l,int r){
	if(t[x].l>r||t[x].r<l)return 0;
	else if(t[x].l>=l&&t[x].r<=r){
		return t[x].sum;
	}
	if(t[x].tag)down(x);
	int ans=0;
	int mid=(t[x].l+t[x].r)/2;
	if(l<=mid)ans|=query(x<<1,l,r);
	if(r>mid)ans|=query(x<<1|1,l,r);
	return ans;
}
signed main(){
	scanf("%lld %lld %lld",&n,&tt,&m);
	build(1,1,n);
	while(m--){
		char op;
		scanf("%s",&op);
		if(op=='C'){
			int l,r,k;
			scanf("%lld %lld %lld",&l,&r,&k);
			if(l>r)swap(l,r);
			modify(1,l,r,gettwo(k));
		}
		else{
			int l,r;
			scanf("%lld %lld",&l,&r);
			if(l>r)swap(l,r);
			int p=query(1,l,r);
			printf("%lld\n",getsum(p));
		}
	}
}
2024/10/25 13:08
加载中...