求hack
查看原帖
求hack
1377813
Luo_Saisei楼主2024/12/12 01:44

思路简述,首先将一棵树按dfs序分成不同的链,类似树链剖分,然后对于链上的节点,我们有以下构造,第一条链上的差值为1,第二条链上的差值为4,第三条为6,然后依次为递增的非质数自然数,但是不知道为啥假了,求hack。

#include <algorithm>
#include <cstdint>
#include<iostream>
#include <cmath>
#include <vector>
#include<queue>
#include <climits>
#include <bitset>
#include <map>
using namespace std;
#define int long long
vector<int> vec[200010];
int val[200010];
bitset<400010> bt;
vector<int> pr;
map<int,int> n_pr;
int pos=1;
bool flag=1;
void euler()
{
	int cnt=0;
	bt.set();
	bt[1]=0;
	n_pr[++cnt]=1;
	for(int i=2;i<=400000;i++)
	{
		if(bt[i]) pr.push_back(i);
		for(int j=1;j<=pr.size()&&i*pr[j-1]<=400000;j++)
		{
			bt[i*pr[j-1]]=0;
			n_pr[++cnt]=i*pr[j-1];
			if(i%pr[j-1]==0) break;
		}
	}
}
void dfs(int u,int f,int pos)
{
	val[u]=val[f]+n_pr[pos];
	flag=0;
	for(auto to:vec[u])
	{
		if(to==f) continue;
		dfs(to,u,pos);
		pos++;
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(nullptr),cout.tie(nullptr);
	euler();
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++) vec[i].clear(),val[i]=0;
		for(int i=1,x,y;i<n;i++)
			cin>>x>>y,vec[x].push_back(y),vec[y].push_back(x);
		flag=1;
		dfs(1,0,1);
		if(flag) cout<<-1;
		else for(int i=1;i<=n;i++) cout<<val[i]<<' ';
		cout<<'\n';
	}
	return 0;
}
2024/12/12 01:44
加载中...