求条P1558
  • 板块学术版
  • 楼主_j27eGU_
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/2 10:58
  • 上次更新2025/7/2 19:58:14
查看原帖
求条P1558
1711405
_j27eGU_楼主2025/7/2 10:58
#include<bits/stdc++.h>
using namespace std;
int l,t,o,id[100010],col[10010];
set <int> sum[100010];
int main()
{
	scanf("%d%d%d",&l,&t,&o);
	int len=sqrt(l),cnt=ceil(l/len);
	for(int i=1;i<=l;i++)
		id[i]=(i-1)/len+1;
	for(int i=1;i<=l;i++)col[i]=1;
	for(int i=1;i<=cnt;i++)
		sum[i].insert(1);
	while(o--)
	{
		char opt;
		scanf(" %c",&opt);
		if(opt=='C')
		{
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			for(int i=min(a,b);i<=max(a,b);i++)col[i]=c;
			if(id[a]==id[b])
			{
				if(min(a,b)==len*(id[a]-1)+1&&max(a,b)==len*id[a])
					sum[id[a]].clear();
				sum[id[a]].insert(c);
				continue;
			}
			sum[id[min(a,b)]].insert(c);
			for(int i=id[min(a,b)]+1;i<id[max(a,b)];i++)
				sum[i].clear(),sum[i].insert(c);
			sum[id[max(a,b)]].insert(c);
			continue;
		}
		int a,b;
		scanf("%d%d",&a,&b);
		if(id[a]==id[b])
		{
			if(min(a,b)==len*(id[a]-1)+1&&max(a,b)==len*id[a])
			{
				printf("%d\n",sum[id[a]].size());
				continue;
			}
			bool vis[40];
			int ans=0;
			memset(vis,0,sizeof(vis));
			for(int i=min(a,b);i<=max(a,b);i++)
				vis[col[i]]=1;
			for(int i=1;i<=t;i++)
				if(vis[i])
					ans++;
			printf("%d\n",ans);
			continue;
		}
		bool vis[40];
		int ans=0;
		memset(vis,0,sizeof(vis));
		for(int i=min(a,b);i<=len*id[min(a,b)];i++)
			vis[col[i]]=1;
		for(int i=id[min(a,b)]+1;i<id[max(a,b)];i++)
			for(set <int>::iterator it=sum[i].begin();it!=sum[i].end();it++)
				vis[*it]=1;
		for(int i=len*(id[max(a,b)]-1)+1;i<=max(a,b);i++)
			vis[col[i]]=1;
		for(int i=1;i<=t;i++)
			if(vis[i])
				ans++;
		printf("%d\n",ans);
	}
}
2025/7/2 10:58
加载中...