萌新求助卡常
  • 板块学术版
  • 楼主Spasmodic
  • 当前回复20
  • 已保存回复20
  • 发布时间2020/10/30 22:19
  • 上次更新2023/11/5 09:28:02
查看原帖
萌新求助卡常
121027
Spasmodic楼主2020/10/30 22:19
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
int n,k,m;
struct seg{
	int sum[N<<2],tag[N<<2];
	seg(){memset(tag,-1,sizeof(tag));}
	void pushup(int k){sum[k]=sum[k<<1]+sum[k<<1|1];}
	void lazy(int k,int l,int r,int v){
		tag[k]=v;
		sum[k]=v*(r-l+1);
	}
	void pushdown(int k,int l,int r,int mid){
		if(tag[k]==-1)return;
		lazy(k<<1,l,mid,tag[k]);
		lazy(k<<1|1,mid+1,r,tag[k]);
		tag[k]=-1;
	}
	void modify(int k,int l,int r,int x,int y,int v){
		if(x<=l&&r<=y){
			lazy(k,l,r,v);
			return;
		}
		int mid=l+r>>1;
		pushdown(k,l,r,mid);
		if(x<=mid)modify(k<<1,l,mid,x,y,v);
		if(mid<y)modify(k<<1|1,mid+1,r,x,y,v);
		pushup(k);
	}
	int query(int k,int l,int r,int x,int y){
		if(x<=l&&r<=y)return sum[k];
		int mid=l+r>>1,ret=0;
		pushdown(k,l,r,mid);
		if(x<=mid)ret+=query(k<<1,l,mid,x,y);
		if(mid<y)ret+=query(k<<1|1,mid+1,r,x,y);
		return ret;
	}
}s[31];
char op[2];
int main(){
	scanf("%d%d%d",&n,&k,&m);
	s[1].modify(1,1,n,1,n,1);
	for(int a,b,c;m--;){
		scanf("%s%d%d",op,&a,&b);
		if(a>b)swap(a,b);
		if(op[0]=='C'){
			scanf("%d",&c);
			for(int i=1;i<=k;i++)s[i].modify(1,1,n,a,b,i==c);
		}else{
			int ans=0;
			for(int i=1;i<=k;i++)ans+=(s[i].query(1,1,n,a,b)>0);
			printf("%d\n",ans);
		}
	}
	return 0;
}

当然如果可以解决这个贴的问题就更好

2020/10/30 22:19
加载中...