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的更多相关文章

  1. BZOJ 3709&&AGC 018 C——多段排序的微扰法

    BZOJ 3709• 有n只怪物,你的初始生命值为z.• 为了打败第i只怪物,你需要消耗cost[i]点生命值,但怪物死后会使你恢复val[i]点生命值.• 任何时候你的生命值都不能小于等于0.• 问 ...

  2. 2019牛客暑期多校训练营(第三场)F Planting Trees 单调队列

    F Planting Trees 题目链接 https://ac.nowcoder.com/acm/contest/883/F 题目描述 The semester is finally over an ...

  3. 牛客多校第三场 F Planting Trees

    牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...

  4. 2015北京网络赛 F Couple Trees 暴力倍增

    Couple Trees Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/123 ...

  5. 牛客多校第三场F Planting Trees 单调栈

    Planting Trees 题意 给出一个矩阵,求最大矩阵面积满足该矩阵中任2元素的绝对值之差小于等于M T<1000) (n<500)但是题目明示单组(n*3)可过 分析 又是矩阵问题 ...

  6. Hiho 1232 北京网络赛 F Couple Trees

    给两颗标号从1...n的树,保证标号小的点一定在上面.每次询问A树上的x点,和B树上的y点同时向上走,最近的相遇点和x,y到这个点的距离. 比赛的时候想用倍增LCA做,但写渣了....后来看到题解是主 ...

  7. [AGC 018 E] Sightseeing plan

    STO ZKY ORZ Description 给定一张网格图和三个矩形,每次只能向上或向右走.你需要从矩形 \(A\) 中的一个点 \(S\) 出发,到达矩形 \(B\) 中的一个点 \(P\) , ...

  8. AGC 016 F - Games on DAG(状压dp)

    题意 给你一个有 \(n\) 个点 \(m\) 条边 DAG 图,点的标号和拓扑序一致. 现在有两个人进行博弈,有两个棋子分别在 \(1, 2\) 号点上,需要不断移动到它指向的点上. 如果当前两个点 ...

  9. 2019牛客多校第三场 F.Planting Trees

    题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...

随机推荐

  1. swift版的CircleView

    swift版的CircleView 效果图 源码 // // CircleView.swift // CircleView // // Created by YouXianMing on 15/10/ ...

  2. RESTful 架构基础

    源自:https://mp.weixin.qq.com/s/wEr2jAVphzB1G_MISlLU0w REST(Representational State Transfer)架构风格是一种世界观 ...

  3. 铁乐学Python_day09_函数

    今天我们来学习函数. 产生的原由,若没有函数,会显得重复代码多,可读性差,也会造成重复造轮子的情景. 故产生了函数,用来封装好一个功能,它是以功能为导向的. 1.[函数的样式] 例如自己定义一个函数: ...

  4. 索引&切片 切割split

    索引   s[n]                                                        # 中括号里n为一个数字 切片    s[0:9]           ...

  5. FTP工具FileZilla&WinSCP与FTP类库FluentFTP

    FileZilla Filezilla分为client和server.其中FileZilla Server是Windows平台下一个小巧的第三方FTP服务器软件,系统资源也占用非常小,可以让你快速简单 ...

  6. python3 装饰器全解

    本章结构: 1.理解装饰器的前提准备 2.装饰器:无参/带参的被装饰函数,无参/带参的装饰函数 3.装饰器的缺点 4.python3的内置装饰器 5.本文参考 理解装饰器的前提:1.所有东西都是对象( ...

  7. 1.4 Installation and Setup(安装和设置)

    1.4 Installation and Setup(安装和设置) 这里我们用Anaconda发行版作为Python的使用环境,推荐安装Python3.6,本书就是用Python3.6代码写成的.(译 ...

  8. BZOJ4802:欧拉函数(Pollard-Rho,欧拉函数)

    Description 已知N,求phi(N) Input 正整数N.N<=10^18 Output 输出phi(N) Sample Input 8 Sample Output 4 Soluti ...

  9. Day16 IO流

    流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. Ja ...

  10. 【转】np.linspace()、np.logspace()、np.arange()

    转自:https://blog.csdn.net/ui_shero/article/details/78881067 1.np.linspace() 生成(start,stop)区间指定元素个数num ...