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 ...
随机推荐
- [翻译] InstagramPhotoPicker
InstagramPhotoPicker Present Image Picker like Instagram. 展示图片选择器,像Instagram这款应用一样. Installation - 安 ...
- Python初学者第二十四天 函数进阶(3)生成器
24day 1.列表生成式: 循环模式:[变量(加工后的变量) for 变量 in iterable] print([i for i in range(0,101,2)]) [1,4,9,16,25, ...
- CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)
CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...
- JS传递函数并且调用
封装的函数: function getDataByJsonP(methName, inData, fn) { // 这里fn可以直接传入函数名字 $.ajax({ url: '', //请求的url地 ...
- ubuntu 12.04配置mac的Lion主题的风格
1.下载mac壁纸 http://drive.noobslab.com/data/wallpapers/Mac-os-x-Wallpapers%28NoobsLab.com%29.zip 根据自己喜好 ...
- 写了一个web使用向导的小插件
运行效果: 引入插件: <link rel="stylesheet" href="ez-guide.css"> <script src=&qu ...
- SPOJ-SUBSET Balanced Cow Subsets
嘟嘟嘟spoj 嘟嘟嘟vjudge 嘟嘟嘟luogu 这个数据范围都能想到是折半搜索. 但具体怎么搜呢? 还得扣着方程模型来想:我们把题中的两个相等的集合分别叫做左边和右边,令序列前一半中放到左边的数 ...
- 【转】Android SDK,ADT,API 版本的对应关系
写对应关系之前,先了解一下几个名字的含义. 一. Android ADT: 按照官方网站的开发介绍:Android Development Tools (ADT) is a plugin for th ...
- 7、Android---网络技术
玩手机不能上网是单机的时代 而且现在的流量也出了无限使用 几乎网络离不开人们的日常生活 7.1.WebView的用法 遇到一些特殊的请求 在程序中展示一些网页 加载和显示网页都是浏览器的任务 在不打开 ...
- Python基础-画图:matplotlib.pyplot.scatter
转载自博客:https://blog.csdn.net/qiu931110/article/details/68130199 matplotlib.pyplot.scatter 1.scatter函数 ...