过不了HACK,为啥?
  • 板块P1558 色板游戏
  • 楼主oiyang
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/3 17:02
  • 上次更新2023/11/3 19:35:10
查看原帖
过不了HACK,为啥?
856309
oiyang楼主2023/11/3 17:02
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-')
			f=-f;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
int L,T,O;
const int maxn=2.7e5;
int col[maxn];
struct Segmenttree
{
	int l,r,clr;
	bool all;
}t[maxn*4];
bool pd[35];
void spread(int p)
{
	t[p*2].clr=t[p].clr;
	t[p*2+1].clr=t[p].clr;
	t[p*2].all=t[p*2+1].all=1;
}
void pushup(int p)
{
	if(t[p*2].all && t[p*2+1].all && t[p*2].clr==t[p*2+1].clr)
	{
		t[p].clr=t[p*2].clr;
		t[p].all=1;
	}
}
void build(int p,int l,int r)
{
	t[p].l=l,t[p].r=r;
	t[p].all=1,t[p].clr=1;
	if(l==r)
		return ;
	int mid=(l+r)>>1;
	if(l<=mid)
		build(p*2,l,mid);
	if(r>mid)
		build(p*2+1,mid+1,r);
}
void change(int p,int l,int r,int c)
{
	if(l<=t[p].l && r>=t[p].r)
	{
		t[p].all=1;
		t[p].clr=c;
		return ;
	}
	if(t[p].all)
		spread(p);
	t[p].all=0;
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
		change(p*2,l,r,c);
	if(r>mid)
		change(p*2+1,l,r,c);
	pushup(p);
}
int ans;
void query(int p,int l,int r)
{
	if(t[p].all)
		spread(p);
	if(t[p].all)
	{
		if(!pd[t[p].clr])
		{
			pd[t[p].clr]=1;
			ans++;
			return ;
		}
		return ;
	}
	
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
		query(p*2,l,r);
	if(r>mid)
		query(p*2+1,l,r);
	pushup(p);
}
int main()
{
	L=read(),T=read(),O=read();
	char opt;
	int a,b,c;
	build(1,1,L);
	while(O--)
	{
		do{opt=getchar();}
		while(opt!='C' && opt!='P');
		if(opt=='C')
		{
			scanf("%d%d%d",&a,&b,&c);
			if(a>b)
				swap(a,b);
			change(1,a,b,c);
		}
		if(opt=='P')
		{
			memset(pd,0,sizeof pd);
			ans=0;
			scanf("%d%d",&a,&b);
			if(a>b)
				swap(a,b);
			query(1,a,b);
			printf("%d\n",ans);
		}
	}
	return 0;
}
2023/11/3 17:02
加载中...