题目传送门:https://arc063.contest.atcoder.jp/tasks/arc063_c

题目翻译

给你一个树,上面有\(k\)个点有权值,问你是否能把剩下的\(n-k\)个点全部填上权值,使得每条边链接的两个点权值相差\(1\),如果可以做到需要输出任意一组方案。

题解

我们考虑每条边权值为\(1\)或\(-1\),那么相当于黑白染色一样,所有点权值的奇偶性也都是确定的。如果与读入的\(k\)个点中某个点相冲突了就\(GG\)。另外每个点的取值范围都可以转化成一段区间\([l,r]\)内的奇/偶数,假设父亲的值域区间为\([l,r]\),那么儿子的值域区间就可以是\([l-1,r+1]\),同样的,值域区间也可以通过儿子转移过来。如果区间的交为空那么就无解。确定值域区间之后再自上而下确定权值即可。

时间复杂度:\(O(n)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=1e5+5; int n,k,tot,rt;
bool fake,bo[maxn];
int now[maxn],pre[maxn*2],son[maxn*2];
int l[maxn],r[maxn],odd[maxn],ans[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} void add(int a,int b) {
pre[++tot]=now[a];
now[a]=tot,son[tot]=b;
} void dfs(int fa,int u,int now_odd) {
if(fake)return;
if(bo[u]&&odd[u]!=now_odd) {fake=1;return;}
if(!bo[u]) {odd[u]=now_odd,l[u]=l[fa]-1,r[u]=r[fa]+1;}
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(v!=fa) {
dfs(u,v,now_odd^1);
l[u]=max(l[u],l[v]-1);
r[u]=min(r[u],r[v]+1);
}
if(r[u]<l[u])fake=1;
} void check(int fa,int u,int x) {
ans[u]=x;
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(v!=fa) {
if(x-1>=l[v]&&x-1<=r[v])check(u,v,x-1);
else check(u,v,x+1);
}
} int main() {
n=read();
for(int i=1;i<n;i++) {
int x=read(),y=read();
add(x,y),add(y,x);
}
k=read();
for(int i=1;i<=k;i++) {
int x=read(),v=read();
if(i==1)rt=x;bo[x]=1;
l[x]=r[x]=v,odd[x]=v&1;
}
dfs(0,rt,odd[rt]);
if(!fake) {
puts("Yes");check(0,rt,l[rt]);
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
}
else puts("No");
return 0;
}

最新文章

  1. JSP页面之间互相传值
  2. Extjs 图片的自动缩放
  3. iOS之通过PaintCode快速实现交互动画的最方便方法 未解问题
  4. Spring 事物机制
  5. php 基础复习(2)GD库
  6. poj 1840 暴力+标记
  7. 【python自动化第四篇:python入门进阶】
  8. centos下安装mysql步骤
  9. linux安装Tesseract-OCR
  10. 题目1522:包含min函数的栈
  11. docker iotop :OSError: Netlink error: No such file or directory
  12. 【Oracle学习笔记】序列
  13. tar.gz,直接解压可用?还是需要编译安装?
  14. CodeForces 671C - Ultimate Weirdness of an Array
  15. APACHE SPARK 2.0 API IMPROVEMENTS: RDD, DATAFRAME, DATASET AND SQL
  16. PF部分代码解读
  17. UVA11995 I Can Guess the Data Structure!
  18. VMware如何给虚拟机添加新硬盘
  19. workerman-todpole 执行流程(2)
  20. Java用户输入数值,做简单的猜数字游戏,导入基础的工具包util

热门文章

  1. Leet Code OJ 338. Counting Bits [Difficulty: Medium]
  2. 纯JS设置首页,增加收藏,获取URL參数,解决中文乱码
  3. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
  4. kubernetes资源调度之LimitRange
  5. 通过路由管理视图间切换 - AngularJS路由解析
  6. longestIncreasingSequence最长上升子序列问题
  7. 关于mongodb副本集读写分离 及 日志切换
  8. svn服务器迁移(windows下)
  9. MFC学习之Radio---MFC Radio按钮组的使用例子
  10. java中 hashCode() 和 equals()