社区讨论

How D(悬两关)

学术版参与者 5已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi0va50b
此快照首次捕获于
2025/11/16 06:37
4 个月前
此快照最后确认于
2025/11/17 09:11
4 个月前
查看原帖
我能怎么办,我也很绝望啊啊啊,我先把这个写了再去 E,掉了我 10\sim10 分啊啊啊
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct xy
{
	int xl,xr,yl,yr;
};
vector<xy> e;
vector<xy> ee;
int a,b;
void pba(xy p)
{
	if(p.xr<a)
		p.yl-=b,p.yr-=b;
	else 
		p.yl+=b,p.yr+=b;
	ee.push_back(p);
}
void pbb(xy p)
{
	if(p.yr<a)
		p.xl-=b,p.xr-=b;
	else
		p.xl+=b,p.xr+=b;
	ee.push_back(p);
}
long long sz[1000100];
long long f[1001000];
bool vis[1001000];
__inline int q(int x){
	if(f[x]==x)return x;
	return f[x]=q(f[x]);
}
__inline void merge(int x,int y)
{
	x=q(x),y=q(y);
	if(x==y)return;
	f[x]=y;
	sz[y]+=sz[x];
}
__inline bool judge(xy x,xy y)
{
	bool f=(x.xr==y.xl-1&&x.yr>=y.yl)||(x.yr==y.yl-1&&x.xr>=y.xl);
	swap(x,y);
	f|=(x.xr==y.xl-1&&x.yr>=y.yl)||(x.yr==y.yl-1&&x.xr>=y.xl);
	return f;
}
signed main()
{
	int n,x,y;cin>>n>>x>>y;
	ee.push_back((xy){0,x-1,0,y-1});
	for(int i=1;i<=n;i++)
	{
		swap(e,ee);ee.clear();
		char t;cin>>t; 
		cin>>a>>b;
		switch(t)
		{
			case 'X':
				for(auto x:e)
				{
					if(x.xl>=a||x.xr<a)
						pba(x);
					else
					{
						xy p={x.xl,a-1,x.yl,x.yr},q={a,x.xr,x.yl,x.yr};
						pba(p),pba(q);
					}
				}
				break;
			case 'Y':
				for(auto x:e)
				{
					if(x.yl>=a||x.yr<a)
						pbb(x);
					else
					{
						xy p={x.xl,x.xr,x.yl,a-1},q={x.xl,x.xr,a,x.yr};
						pbb(p),pbb(q);
					}
				}
				break;
			default:
				cout<<"lucy Ak ioi\n";
				return 0;
		}
//		for(auto x:ee)
//		{
//			cout<<x.xl<<' '<<x.xr<<' '<<x.yl<<' '<<x.yr<<'\n'; 
//		}
//		cout<<'\n';
	}
	for(int i=0;i<ee.size();i++)
		f[i]=i,sz[i]=(ee[i].xr-ee[i].xl+1)*(ee[i].yr-ee[i].yl+1);
	for(int i=0;i<ee.size();i++)
	{
		if(vis[i])continue;
		vis[i]=1;
		for(int j=0;j<ee.size();j++)
		{
			if(judge(ee[i],ee[j]))
			{
				merge(i,j);
			}
		}
	}
	vector<long long> ans;
	for(int i=0;i<ee.size();i++)
	{
		if(f[i]==i)
		{
			ans.push_back(sz[i]); 
		}
	}
	sort(ans.begin(),ans.end());
	cout<<ans.size()<<'\n';
	for(auto x:ans)cout<<x<<' ';
	cout<<'\n';
//	for(int i=0;i<ee.size();i++)
//	{
//		for(int j=0;j<ee.size();j++)
//			cout<<judge(ee[i],ee[j])<<' ';
//		cout<<'\n';
//	}
	return 0;
}

回复

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

正在加载回复...