@description@

给定两棵树 A, B。现你需要构造一组值 (X1, X2, ..., XN)(两棵树编号相同的点对应权值相同),使得两棵树内任意子树的权值和的绝对值为 1。

无解输出 IMPOSSIBLE。

原题链接。

@solution@

由于权值和为 1,可以推算出每个结点的奇偶性。如果两棵树中同一结点权值奇偶性不同则无解。

考虑已知每个结点权值的奇偶性之后是否能够构造出一组解。

既然是构造题,从简原则,猜想偶点总是为 0,奇点总是为 1 或 -1。

手玩一下样例发现是对的。

那么相当于给每个奇点染黑白色,使得每棵子树内黑白点个数相差为 1。

然后就开始玄幻起来了。我们对于每个奇点 i,在两棵树 A, B 的结点 Ai, Bi 之间连一条边。

注意到此时新图中只有两棵树的根度数可能为奇数,所以我们从根出发跑欧拉路径。

如果欧拉路径中 Ai->Bi 则 i 为黑点(-1),否则 i 为白点(1)。

正确性理解起来不难:对于每个连通块(子树),进入连通块的广义 “入度” 与从连通块出的广义 “出度” 是相等的。

而子树向外只有两类边:连向父亲(只有一条);连向另一棵树。也就是连向另一棵树的边(奇点之间的边)入边与出边相差 1,就是我们的构造目标。

@accepted code@

#include <cstdio>

const int MAXN = 200000;
const int MAXM = 8*MAXN; struct edge{
int to; bool tag;
edge *nxt, *rev;
}edges[MAXM + 5], *adj[MAXN + 5], *ecnt = edges; void addedge(int u, int v) {
edge *p = (++ecnt), *q = (++ecnt);
p->to = v, p->tag = false, p->nxt = adj[u], adj[u] = p;
q->to = u, q->tag = false, q->nxt = adj[v], adj[v] = q;
p->rev = q, q->rev = p;
} int X[MAXN + 5], N;
void dfs(int x) {
for(;adj[x];) {
edge *p = adj[x]; adj[x] = adj[x]->nxt;
if( p->tag ) continue;
p->tag = p->rev->tag = true;
dfs(p->to);
if( x - p->to == -N ) X[x] = -1;
else if( x - p->to == N ) X[p->to] = 1;
}
} int cnt[2][MAXN + 5];
int main() {
scanf("%d", &N);
int rt1;
for(int i=1;i<=N;i++) {
int x; scanf("%d", &x);
if( x != -1 ) {
addedge(x, i);
cnt[0][x]++;
}
else rt1 = i;
}
for(int i=1;i<=N;i++) {
int x; scanf("%d", &x);
if( x != -1 ) {
addedge(x + N, i + N);
cnt[1][x]++;
}
}
for(int i=1;i<=N;i++) {
if( (cnt[0][i] - cnt[1][i]) & 1 ) {
puts("IMPOSSIBLE");
return 0;
}
if( !(cnt[0][i] & 1) )
addedge(i, N + i);
}
dfs(rt1);
puts("POSSIBLE");
for(int i=1;i<=N;i++)
printf("%d%c", X[i], (i == N ? '\n' : ' '));
}

@details@

仿佛发现了比网络流建模更难的东西.jpg。

不愧是 AGC,轻易就出了一道人类智慧题。

有一个小细节:整棵树作为一棵子树,是没有向上连向父亲的边的。所以证明时还要特殊讨论一下(不过总之证得出来)。

@atcoder - AGC018F@ Two Trees的更多相关文章

  1. AGC018F - Two Trees

    题意 有两棵节点数均为 n 的有根树,你需要构造一个序列 \(X_1,X_2,...,X_n\).使得对于每一棵树的每一个节点, 若令它所有的后代(包括它本身)为 \(a_1,a_2,...,a_k\ ...

  2. 【AGC018F】Two Trees 构造 黑白染色

    题目描述 有两棵有根树,顶点的编号都是\(1\)~\(n\). 你要给每个点一个权值\(a_i\),使得对于两棵树的所有顶点\(x\),满足\(|x\)的子树的权值和\(|=1\) \(n\leq 1 ...

  3. AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识

    链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...

  4. Atcoder Grand-014 Writeup

    A - Cookie Exchanges 题面 Takahashi, Aoki and Snuke love cookies. They have A, B and C cookies, respec ...

  5. AtCoder Beginner Contest 115 题解

    题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit ...

  6. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  7. hdu2848 Visible Trees (容斥原理)

    题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...

  8. [LeetCode] Minimum Height Trees 最小高度树

    For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...

  9. [LeetCode] Unique Binary Search Trees 独一无二的二叉搜索树

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

随机推荐

  1. Kubernetes fabric8 JavaAPI

    Kubernetes fabric8 JavaAPI 一.依赖准备 <dependency> <groupId>io.fabric8</groupId> <a ...

  2. Spring IOC 容器 简介

    Spring 容器是 Spring 框架的核心.容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁. Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件. ...

  3. C语言关于数据类型转换

    自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生. 1) 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如: ; ...

  4. 【HTTP】Web及网络基础&HTTP基础

    HTTP协议访问Web 一.大体访问过程 1. 浏览器地址栏输入URL 2. 浏览器从服务端获取文件资源 3. 浏览器显示Web页面 二.HTTP的版本历史 1. HTTP/0.9 没有作为正式的标准 ...

  5. [Chrome插件开发]001.入门

    Chrome插件开发入门 Chrome扩展文件 Browser Actions(扩展图标) Page Actions(地址栏图标) popup弹出窗口 Background Pages后台页面 实战讲 ...

  6. html5学习之路_005

    PHP环境搭建 1.下载安装xampp 2.打开xampp,开启mysql和apache 3.在开发环境eclips中下载插件 4.安装php 5.切换到php开发环境 6.创建一个php项目 7.打 ...

  7. [FlashDevelop] 003.FlashDevelop + LayaFlash + Starling环境配置及实战

    1.首先我们需要下载LayaStarling框架地址:http://layabox.com/index.php?m=content&c=index&a=lists&catid= ...

  8. 50个SQL语句(MySQL版) 问题二

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  9. Rocket - debug - TLDebugModuleInner - HARTINFO

    https://mp.weixin.qq.com/s/9GjZAax0SZhRqLne16jn-w 简单介绍TLDebugModuleInner中HARTINFO寄存器的实现. 1. HARTINFO ...

  10. Docker 容器优雅终止方案

    原文链接:Docker 容器优雅终止方案 作为一名系统重启工程师(SRE),你可能经常需要重启容器,毕竟 Kubernetes 的优势就是快速弹性伸缩和故障恢复,遇到问题先重启容器再说,几秒钟即可恢复 ...