标签:ch int 题解 ThREE ret 黑点 col AT5759
link
sol
这个问题显然只有 \(\%3\) 的余数才有用,所以我们用 \(i \% 3\) 来替换 \(i\)
很容易发现,只要点对中存在一个 \(0\) ,那么肯定满足条件,所以先使用 \(1\) 和 \(2\) 来构造
要使得一个距离为 \(3\) 的点对符合要求,那么必须要让一个为 \(1\) ,一个为 \(2\),所以要使得所有权值相同的点不为 \(3\)。
由于 \(3\) 是单数,所以我们想到将树黑白染色,每一个点都与它相连的点颜色不同,所以将 黑白分别分配给 \(1,2\)
然后考虑加入 \(0\) 的情况
我们先默认 黑点数 \(≤\) 白点数
然后分两种情况
- 黑点数 \(≤ {n\over 3}\)
此时要将 \(0\) 来填充黑点,因为只要点对中出现一个 \(0\) 就必然合法,然后将 \(1,2\) 和剩下的 \(0\) 加入白点
- 黑点数 \(>{n\over 3}\) 可以先把 \(1,2\) 插入黑点,白点,然后将 \(0\) 填入剩下的黑点白点
code
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> v[3],c[3];
int N;
vector<int> e[200005];
int P[200005],col[200005];
inline int read(){
int ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
void dfs(int x,int fa){
col[x]=1-col[fa];
c[col[x]+1].push_back(x);
for(auto i:e[x]) if(i^fa) dfs(i,x);
}
int main(){
freopen("AT5759.in","r",stdin);
freopen("AT5759.out","w",stdout);
N=read();
for(int i=1,x,y;i<N;i++){
x=read(),y=read();
e[x].push_back(y);e[y].push_back(x);
}
dfs(1,0);
for(int i=1;i<=N;i++) v[i%3].push_back(i);
if(c[1].size()>c[2].size())swap(c[2],c[1]);
int cnt0=0,cnt1=0,cnt2=0;
if(c[1].size()<=N/3){
for(auto i:c[1]) P[i]=v[0][cnt0++];
for(auto i:c[2]){
if(cnt0<v[0].size())P[i]=v[0][cnt0++];
else if(cnt1<v[1].size())P[i]=v[1][cnt1++];
else if(cnt2<v[2].size())P[i]=v[2][cnt2++];
}
}
else {
for(auto i:c[1]){
if(cnt1<v[1].size())P[i]=v[1][cnt1++];
else P[i]=v[0][cnt0++];
}
for(auto i:c[2]){
if(cnt2<v[2].size())P[i]=v[2][cnt2++];
else P[i]=v[0][cnt0++];
}
}
for(int i=1;i<=N;i++)printf("%d ",P[i]);
return 0;
}
标签:ch,int,题解,ThREE,ret,黑点,col,AT5759
来源: https://www.cnblogs.com/martian148/p/15547215.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。