AGC 018 F - Two Trees
F - Two Trees
题意:
给定两棵都是N个节点的有根树,节点均从1~N标号。给每个标号定一个权值(类似一号点的权值是x,那么两棵树中1号点的权值都是x),使在两棵树满足以任意节点为根的子树的权值和为1或-1。输出任意一种解或判断无解,N<=100000。
分析:
欧拉回路。
首先每棵子树的权值和都-1或者1,,如果知道了每个点有多少个子节点,那么就可以知道他的奇偶性(奇数个儿子=>权值为偶数,偶数个儿子=>权值为奇数)。现在可以判断无解了:如果同一个节点在两棵树内的奇偶性不同。
然后建立一个0点,将两棵树连起来;然后一个标号的点在两棵树上是奇点,那么有第一棵树的这个点向第二棵树的这个点连一条边(x->x+n)。然后跑欧拉回路,对于从第一棵树到第二颗树的点,权值为1,否则为-1,偶点为0。
具体的解释证明,画一下,挺对的。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
struct Edge{
int fr, to, nxt;
}e[N << ];
int head[N], f1[N], f2[N], c1[N], c2[N], sk[N << ], ans[N], top = , En = ;
bool vis[N << ]; inline void add_edge(int u,int v) {
// cout << u << " " << v << "\n";
++En; e[En].fr = u, e[En].to = v, e[En].nxt = head[u]; head[u] = En;
++En; e[En].fr = v, e[En].to = u, e[En].nxt = head[v]; head[v] = En;
}
void dfs(int u) {
while () {
int k = head[u];
if (!k) break;
head[u] = e[k].nxt;
if (!vis[k]) {
vis[k] = vis[k ^ ] = ;
dfs(e[k].to);
sk[++top] = k;
}
}
}
int main() {
freopen("1.txt", "r", stdin);
int n = read();
for (int i = ; i <= n; ++i) {
int x = read();
if (x == -) x = ;
f1[i] = x, c1[x] ++;
add_edge(x, i);
}
for (int i = ; i <= n; ++i) {
int x = read();
if (x == -) x = ;
f2[i] = x, c2[x] ++;
if (x == ) add_edge(x, i + n);
else add_edge(x + n, i + n);
}
for (int i = ; i <= n; ++i) {
if (c1[i] % != c2[i] % ) { puts("IMPOSSIBLE"); return ; }
if ((c1[i] & ) && (c2[i] & )) ans[i] = ;
else add_edge(i, i + n);
}
puts("POSSIBLE");
dfs();
for (int i = top; i >= ; --i) {
int k = sk[i];
if (e[k].fr + n == e[k].to) ans[e[k].fr] = ;
if (e[k].fr - n == e[k].to) ans[e[k].fr - n] = -;
}
for (int i = ; i <= n; ++i) {
printf("%d ", ans[i]);
}
return ;
}
AGC 018 F - Two Trees的更多相关文章
- BZOJ 3709&&AGC 018 C——多段排序的微扰法
BZOJ 3709• 有n只怪物,你的初始生命值为z.• 为了打败第i只怪物,你需要消耗cost[i]点生命值,但怪物死后会使你恢复val[i]点生命值.• 任何时候你的生命值都不能小于等于0.• 问 ...
- 2019牛客暑期多校训练营(第三场)F Planting Trees 单调队列
F Planting Trees 题目链接 https://ac.nowcoder.com/acm/contest/883/F 题目描述 The semester is finally over an ...
- 牛客多校第三场 F Planting Trees
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...
- 2015北京网络赛 F Couple Trees 暴力倍增
Couple Trees Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/123 ...
- 牛客多校第三场F Planting Trees 单调栈
Planting Trees 题意 给出一个矩阵,求最大矩阵面积满足该矩阵中任2元素的绝对值之差小于等于M T<1000) (n<500)但是题目明示单组(n*3)可过 分析 又是矩阵问题 ...
- Hiho 1232 北京网络赛 F Couple Trees
给两颗标号从1...n的树,保证标号小的点一定在上面.每次询问A树上的x点,和B树上的y点同时向上走,最近的相遇点和x,y到这个点的距离. 比赛的时候想用倍增LCA做,但写渣了....后来看到题解是主 ...
- [AGC 018 E] Sightseeing plan
STO ZKY ORZ Description 给定一张网格图和三个矩形,每次只能向上或向右走.你需要从矩形 \(A\) 中的一个点 \(S\) 出发,到达矩形 \(B\) 中的一个点 \(P\) , ...
- AGC 016 F - Games on DAG(状压dp)
题意 给你一个有 \(n\) 个点 \(m\) 条边 DAG 图,点的标号和拓扑序一致. 现在有两个人进行博弈,有两个棋子分别在 \(1, 2\) 号点上,需要不断移动到它指向的点上. 如果当前两个点 ...
- 2019牛客多校第三场 F.Planting Trees
题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...
随机推荐
- 使用keychain永久存储数据
使用keychain永久存储数据 https://github.com/soffes/sskeychain keychain当然还是使用开源的好:),keychain是干啥用的?这个,baidu一下你 ...
- 团队开发中,eclipse中安装jre
团队合作中配置jre时,jre名称应该保持一致,否则不要提交.classpath文件 window-preferences 团队合作中,JRE name一定要一致!
- win8中 cmd直接以管理员权限运行
一.组合键 WIN+X 二.锁定到任务栏,方便以后快速启动 三.控制面板->控制中心 四.更改用户账户控制设置--调到最低 好了,点击任务栏的命令提示符
- ABAP很厉害是怎么一种体验?
知乎上偶然看到这个问题,觉得很有意思,我也来回答一发. 我本科和研究生学的是计算机专业,做项目用C/C++,研究生三年项目的代码量大概在三到四万行左右.2007年大学毕业加入SAP成都研究院一直工作到 ...
- 关于使用JQ scrollTop方法进行滚动定位
没图我说个锤子,先来个自拍镇楼. 又到了每周周五总结时间.我广州刘德华又来讲故事了.这一周没啥任务,就一个任务,产品口头交代了两句,也没有psd没有设计图没有样式.自由发挥,你自己敲代码做个作品出来. ...
- python subprocess 和 multiprocess选择以及我遇到的坑
The subprocess option: subprocess is 用来执行其他的可执行程序的,即执行外部命令. 他是os.fork() 和 os.execve() 的封装. 他启动的进程不会把 ...
- 查询包含指定字段的所有表名的SQL脚本
select [name] from sysobjects where [id] in (select [id] from syscolumns where [name]='ReceiptNbr') ...
- codeforces 293E Close Vertices
题目链接 正解:点分治+树状数组. 点分治板子题,直接点分以后按照$w$排序,扫指针的时候把$w$合法的路径以$l$为下标加入树状数组统计就行了. 写这道题只是想看看我要写多久..事实证明我确实是老年 ...
- JavaScript组合继承的一点思考
今天看<JavaScript高级程序设计>一书中关于组合继承模式时.书上有这么一个Demo程序: <html> <head> </head> <b ...
- Java执行CMD命令
参见:https://blog.csdn.net/lixingshi/article/details/50467840 public static void runtimeCommand() thro ...