@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. mysql小白系列_14 线上故障分析与排错

    1.重现故障5---线上执行update报错,并处理.(表结构和UPDATE语句自己构造,请给出详细步骤) 1)update故障出现ERROR 1206 (HY000): The total numb ...

  2. canvas遇到的一些问题

    1.移动端无法全屏问题 问题描述:由于canvas的width和height只能设置px值,不支持rem单位,所以想在移动设备屏幕分辨率繁杂的情况下达到canvas铺满全屏的效果很困难. 解决方法:通 ...

  3. 用了这么多年的 Java 泛型,你对它到底有多了解?

    作为一个 Java 程序员,日常编程早就离不开泛型.泛型自从 JDK1.5 引进之后,真的非常提高生产力.一个简单的泛型 T,寥寥几行代码, 就可以让我们在使用过程中动态替换成任何想要的类型,再也不用 ...

  4. iOS不移除通知也不会崩溃原因

    在iOS9.0之前,通知中心对观察者对象进行unsafe_unretained 引用,当被引用的对象释放时不会自动置为nil,,也就是成了野指针. iOS9.0之后通知中心对观察者做了弱引用. 参考: ...

  5. PAT-1057 Stack (树状数组 + 二分查找)

    1057. Stack Stack is one of the most fundamental data structures, which is based on the principle of ...

  6. 环境篇:Zeppelin

    环境篇:Zeppelin Zeppelin 是什么 Apache Zeppelin 是一个让交互式数据分析变得可行的基于网页的开源框架.Zeppelin提供了数据分析.数据可视化等功能. Zeppel ...

  7. uni-app运行到浏览器跨域H5页面的跨域问题解决方案

    官方文档对跨域的解决方案推荐: https://ask.dcloud.net.cn/article/35267 更方便的解决方案 项目根目录直接创建一个vue.config.js文件,并在里面配置代理 ...

  8. 画出决策边界线--plot_2d_separator.py源代码【来自python机器学习基础教程】

    import numpy as np import matplotlib.pyplot as plt from .plot_helpers import cm2, cm3, discrete_scat ...

  9. python3程序开发指南——第1章 笔记

    python文件的扩展名为.py ,但是python GUI程序的扩展名为.pyw 在python中,注释以#开始,作用范围为该行 IDLE提供了三个关键功能:输入python表达式与代码,并在pyt ...

  10. 04 . Mysql主从复制和读写分离

    Mysql AB复制 ​ AB复制又称之为主从复制,用于实现数据同步,实现Mysql的AB复制时,数据库的版本尽量保持一致,如果不能保持一致,最起码从服务器的版本要高于主服务器,但是就无法实现双向复制 ...