再次造福后人
查看原帖
再次造福后人
279800
ExplodingKonjac楼主2021/9/11 09:47

可以生成 data.in 和 data.ans

程序内 n 是点数,m 是询问数,v 是值域

如有需要自己更改 n,m,v 的大小

#include <bits/stdc++.h>
using namespace std;
mt19937 mt_rnd(time(0));
inline int random(int l,int r)
	{ return mt_rnd()%(r-l+1)+l; }
int n=30000,m=30000,v=10000000,tot,w[100005],fa[100005];
int find(int x)
	{ return x==fa[x]?x:fa[x]=find(fa[x]); }
struct Edge{ int to,nxt; }e[200005];
int cnt,head[100005];
inline void addEdge(int u,int v)
	{ e[++cnt]=(Edge){v,head[u]},head[u]=cnt; }
void dfs(int u,int f)
{
	fa[u]=f;
	for(int i=head[u];i;i=e[i].nxt)
		if(e[i].to!=f)
			dfs(e[i].to,u);
}
int solve(int u,int x)
{
	int res=w[u]>x;
	for(int i=head[u];i;i=e[i].nxt)
		if(e[i].to!=fa[u])
			res+=solve(e[i].to,x);
	return res;
}
int main()
{
	FILE *in_f=fopen("data.in","w");
	FILE *ans_f=fopen("data.ans","w");
	fprintf(in_f,"%d\n",n);
	for(int i=1;i<=n;i++)	fa[i]=i;
	while(tot<n-1)
	{
		int x=random(1,n),y=random(1,n);
		int x1=find(x),y1=find(y);
		if(x1!=y1)
		{
			fa[x1]=y1,tot++,addEdge(x1,y1),addEdge(y1,x1);
			fprintf(in_f,"%d %d\n",x1,y1);
		}
	}
	for(int i=1;i<=n;i++)	fprintf(in_f,"%d ",w[i]=random(1,v));
	dfs(1,0);
	fprintf(in_f,"\n%d\n",m);
	int last=0;
	for(int i=1;i<=m;i++)
	{
		int opt=random(0,2),x=random(1,n),y;
		if(opt==0)
		{
			y=random(1,v);
			fprintf(in_f,"%d %d %d\n",opt,x^last,y^last);
			fprintf(ans_f,"%d\n",last=solve(x,y));
		}
		else if(opt==1)
		{
			w[x]=y=random(1,v);
			fprintf(in_f,"%d %d %d\n",opt,x^last,y^last);
		}
		else
		{
			w[++n]=y=random(1,v);
			fa[n]=x,addEdge(x,n),addEdge(n,x);
			fprintf(in_f,"%d %d %d\n",opt,x^last,y^last);
		}
	}
	fclose(in_f),fclose(ans_f);
	return 0;
}
2021/9/11 09:47
加载中...