可以生成 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;
}