社区讨论

求助,全wa

P1558色板游戏参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m424zfwh
此快照首次捕获于
2024/11/29 10:40
去年
此快照最后确认于
2025/11/04 13:41
4 个月前
查看原帖
CPP
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <queue>
#include <vector>
#include <map>
using namespace std;

#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define maxn 500005

inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

int n,c,m;
int val[maxn];
int k;
int nowl,nowr;
int tag[maxn];
int sum[maxn];

void update(int rt){
	sum[rt]=sum[rt<<1]|sum[rt<<1|1];
	return;
}

void build(int l,int r,int rt){
	if(l==r){
		sum[rt]=1<<1;
		return;
	}
	int mid=(l+r)>>1;
	build(lson);
	build(rson);
	update(rt);
	return;
}

void color(int l,int r,int rt,int c){
	sum[rt]=(1<<c);
	tag[rt]=c;
	return;
}

void push_color(int l,int r,int rt){
	if(tag[rt]){
		int mid=(l+r)>>1;
		color(lson,tag[rt]);
		color(rson,tag[rt]);
		tag[rt]=0;
	}
	return;
}

void change(int l,int r,int rt,int c){
	if(l>=nowl&&r<=nowr){
		color(l,r,rt,c);
		return;
	}
	push_color(l,r,rt);
	int mid=(l+r)>>1;
	if(mid>=nowl) change(lson,c);
	if(mid+1<=nowr) change(rson,c);
	update(rt);
	return;
}

int fin(int l,int r,int rt){
	if(l>=nowl&&r<=nowr){
		return sum[rt];
	}
	push_color(l,r,rt);
	int ans=0;
	int mid=(l+r)>>1;
	if(mid>=nowl) ans|=fin(lson);
	if(mid+1<=nowr) ans|=fin(rson);
	return ans; 
}

int main(){
	n=read();c=read();m=read();
	build(1,n,1);
	for(int i=1;i<=m;++i){
		char opt;scanf("%c",&opt);
		if(opt=='C'){
			int u,v,c;u=read();v=read();c=read();
			if(u>v) swap(u,v);
			nowl=u;nowr=v;
			change(1,n,1,c);
		}
		else{
			int u,v,c;u=read();v=read();
			if(u>v) swap(u,v);
			nowl=u;nowr=v;
			int w=fin(1,n,1);
			int ans=0;
			for(int i=1;i<=c;++i) if(w&(1<<i)) ++ans;
			cout<<ans<<endl;
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...