社区讨论

RE,本地可以通过第一个点

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhjt1nap
此快照首次捕获于
2025/11/04 08:02
4 个月前
此快照最后确认于
2025/11/04 08:02
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
char OUT[105];
int in(){int k=0,f=1;char c=getchar();while (c<'0'||c>'9'){if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9'){k=k*10+c-'0';c=getchar();}return k*f;}
void out(int x){int R_OUT=0;if (x<0) putchar('-'),x=-x;while (x) R_OUT++,OUT[R_OUT]=x%10+'0',x/=10;for (int i=R_OUT;i>=1;i--) putchar(OUT[i]);}
int t,n,m,a,x,y,z,k,ans,sum;
char op;
struct tree{
	int l,r,lazy;
	bool wei;
}tree[35][800005];
void pushdown(int z)
{
	tree[a][z<<1].lazy=tree[a][z].lazy;
	tree[a][z<<1|1].lazy=tree[a][z].lazy;
	if (tree[a][z].lazy==1)
	{
		tree[a][z<<1].wei=1;
		tree[a][z<<1|1].wei=1;
	}
	else
	{
		tree[a][z<<1].wei=0;
		tree[a][z<<1|1].wei=0;
	}
	tree[a][z].lazy=0;
}
void build(int l,int r,int z)
{
	tree[a][z].l=l;tree[a][z].r=r;
	if (l==r) return;
	int mid=(l+r)>>1;
	build(l,mid,z<<1);
	build(mid+1,r,z<<1|1);
}
void build1(int l,int r,int z)
{
	tree[1][z].l=l;tree[1][z].r=r;tree[1][z].wei=1;
	if (l==r) return;
	int mid=(l+r)>>1;
	build1(l,mid,z<<1);
	build1(mid+1,r,z<<1|1);
}
void update(int l,int r,int z)
{
	if (l==tree[a][z].l&&r==tree[a][z].r)
	{
		tree[a][z].lazy=k;
		if (k>0) tree[a][z].wei=1;
		else tree[a][z].wei=0;
		return;
	}
	if (tree[a][z].lazy!=0) pushdown(z);
	int mid=(tree[a][z].l+tree[a][z].r)>>1;
	if (r<=mid) update(l,r,z<<1);
	else if (l>mid) update(l,r,z<<1|1);
	else update(l,mid,z<<1),update(mid+1,r,z<<1|1);
	tree[a][z].wei=tree[a][z<<1].wei|tree[a][z<<1|1].wei;
}
void query(int l,int r,int z)
{
	if (ans) return;
	if (l==tree[a][z].l&&r==tree[a][z].r)
	{
		ans|=tree[a][z].wei;
		return;
	}
	if (tree[a][z].lazy!=0) pushdown(z);
	int mid=(tree[a][z].l+tree[a][z].r)>>1;
	if (r<=mid) query(l,r,z<<1);
	else if (l>mid) query(l,r,z<<1|1);
	else query(l,mid,z<<1),query(mid+1,r,z<<1|1);
	tree[a][z].wei=tree[a][z<<1].wei|tree[a][z<<1|1].wei;
}
signed main()
{
//	freopen("dp.in","r",stdin);
//	freopen("dp.out","w",stdout);
	n=in();t=in();m=in();
	build1(1,n,1);
	for (a=2;a<=t;a++) build(1,n,1);
	for (int i=1;i<=m;i++)
	{
		op=getchar();
		if (op=='C')
		{
			x=in();y=in();z=in();
			if (x>y) swap(x,y);
			k=-1;
			for (a=1;a<z;a++) update(x,y,1);
			for (a=z+1;a<=t;a++) update(x,y,1);
			k=1;a=z;
			update(x,y,1);
		}
		else
		{
			x=in();y=in();sum=0;
			if (x>y) swap(x,y);
			for (a=1;a<=t;a++)
			{
				ans=0;
				query(x,y,1);
				if (ans) sum++;
			}
			out(sum);putchar('\n');
		}
	}
	return 0;
}

回复

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

正在加载回复...