Portal

Description

给出一个\(n(n\leq2\times10^5)\)个点的树,每次可以删除一个度数为偶数的点及其相连的边,求一种能够删掉整棵树的方案。

Solution

简单起见,我们用“Odd树”和“Even树”表示大小为奇数/偶数的树。

首先易知原树为Even树时无解。因为每次都会删掉偶数条边而Even树有奇数条边。

当我们要删掉一棵树的时候,我们将其划分为三个部分:根,Odd子树,Even子树。对于一棵Odd树,其Odd子树必然有偶数个,那么我们可以按Even子树-根-Odd子树的删除顺序将原树变成若干个Odd树。因为删完Even子树后根剩下偶数个度数,可以删掉。

那么接下来要删掉根上有一个额外度数的Even树。一棵Even树的Odd子树必然有奇数个,那么我们依然可以按Even子树-根-Odd子树的删除顺序将原树变成若干个Odd树。因为删完Even子树后根剩下奇数个度数,加上一个额外度数就可以删掉。

...

容易知道上述过程是递归的。而由于子树的大小必然严格小于原树,所以递归会收敛到最小的Odd树(一个独立的点),最小的Even树(零个点),这两个都是可以直接删掉的。所以任意一个Odd树都可以按上述过程删掉。

时间复杂度\(O(n)\)。

Code

//Destruction of a Tree
#include <bits/stdc++.h>
using std::vector;
inline char gc()
{
static char now[1<<16],*s,*t;
if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
return *s++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
const int N=2e5+10;
int n;
vector<int> to[N];
void edAdd(int u,int v) {if(u) to[u].push_back(v),to[v].push_back(u);}
int fa[N],siz[N];
void dfs(int u)
{
siz[u]=1;
for(int i=0;i<to[u].size();i++)
{
int v=to[u][i];
if(v!=fa[u]) fa[v]=u,dfs(v),siz[u]+=siz[v];
}
}
void del(int u)
{
for(int i=0;i<to[u].size();i++)
{
int v=to[u][i];
if(v!=fa[u]&&siz[v]%2==0) del(v);
}
printf("%d ",u);
for(int i=0;i<to[u].size();i++)
{
int v=to[u][i];
if(v!=fa[u]&&siz[v]%2==1) del(v);
}
}
int main()
{
n=read();
if(n%2==0) {puts("NO"); return 0;}
for(int i=1;i<=n;i++) edAdd(read(),i);
dfs(1);
puts("YES"),del(1);
return 0;
}

Codeforces963B - Destruction of a Tree的更多相关文章

  1. CodeForces - 963B Destruction of a Tree (dfs+思维题)

    B. Destruction of a Tree time limit per test 1 second memory limit per test 256 megabytes input stan ...

  2. codeforces 963B Destruction of a Tree

    B. Destruction of a Tree time limit per test 1 second memory limit per test 256 megabytes input stan ...

  3. 963B:Destruction of a Tree

    You are given a tree (a graph with n vertices and n - 1 edges in which it's possible to reach any ve ...

  4. Codeforces Round #475 (Div. 2) D. Destruction of a Tree

    题意:给你一棵树, 只能删度数为偶数的点, 问你能不能将整个图删完, 如果能输入删除的顺序. 思路:对于一棵树来说, 如果里面的点的个数是偶数个则肯定不可能, 偶数个点有奇数条边,而你每次删只能删偶数 ...

  5. cf963b Destruction of a Tree

    越靠近叶子越优先删掉 #include <iostream> #include <vector> #include <cstdio> using namespace ...

  6. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1) 963B 964D B Destruction of a Tree

    题 OvO http://codeforces.com/contest/963/problem/B CF 963B 964D 解 对于题目要求,显然一开始的树,要求度数为偶数的节点个数为奇数个,通过奇 ...

  7. Codeforces 963B Destruction of a Tree 思维+dfs

    题目大意: 给出一棵树,每次只能摧毁有偶数个度的节点,摧毁该节点后所有该节点连着的边都摧毁,判断一棵树能否被摧毁,若能,按顺序输出摧毁的点,如果有多种顺序,输出一种即可 基本思路: 1)我一开始自然而 ...

  8. CodeForces475

    A. Splits #include <cstdio> #include <cstdlib> #include <cmath> #include <cstri ...

  9. Codeforces Round #475 Div. 2 A B C D

    A - Splits 题意 将一个正整数拆分成若干个正整数的和,从大到小排下来,与第一个数字相同的数字的个数为这个拆分的权重. 问\(n\)的所有拆分的不同权重可能个数. 思路 全拆成1,然后每次将2 ...

随机推荐

  1. [dp][uestc oj][最长上升子序列] LIS N - 导弹拦截

    N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  2. 2017年团体程序设计天梯赛 - 大区赛 L3-3

    题意:有向图找哈密顿回路 比赛的时候剪枝只剪了vis 状压没剪对 反而只拿17分... 比赛结束后还去看了一发这个NP问题的QB(快速回溯法...但是对于本题好像大材小用...) 上网看了一个神犇的写 ...

  3. FiraCode 字体 => 箭头函数变成 整体 还有 等于 不等于

    https://github.com/tonsky/FiraCode Enable in Settings → Editor → Color Scheme → Color Scheme Font →  ...

  4. HTML之基本语法(段落标签、标题标签、空格标签、换行标签、图片标签和图片的基本属性)

    一.HTML标签 所谓的HTML的标签就是发明者认为定义好的一些单词,就相当于我们汉语中的字 二.HTML的语法 语法就是用来定义这些“字”应该如何解析或者书写的规则 三.常见标签及基本语法 1.人为 ...

  5. hadoop相关资料集锦

    1 Hadoop集群系列集锦http://www.cnblogs.com/xia520pi/archive/2012/04/08/2437875.html 2 Hadoop和MapReduce详解ht ...

  6. C++中malloc / free 和 new / delete 的区别?

    1.malloc/free 是C++/C语言的标准库函数,New/delete是C++运算符:都是用于申请动态内存和释放内存. 2.new做两件事:分配内存和调用类的构造函数,delete是:调用类的 ...

  7. php的字符转换 & php登入注册界面设计以及源码 & 分离公共部分

    我们在编写的时候总是会出现乱码 https://www.cnblogs.com/mafeng/p/5827215.html php登入注册界面设计以及源码 https://blog.csdn.net/ ...

  8. Maven搭建Struts2+Spring3+Hibernate4框架

    做了三年多的JavaEE开发了,在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框 ...

  9. SSH程序框架之Spring与HIbernate整合

    spring整合hibernate 有两种方式 1.注解方式 2.xml方式实现 Spring整合Hibernate有什么好处? 1.由IOC容器来管理Hibernate的SessionFactory ...

  10. error PRJ0019: 工具从 “正在执行生成后事件... ”

    error PRJ0019: 工具从"正在执行生成后事件..." 原因是属性->生成事件->生成后事件 命令行设置错误导致的,修改即可 因为path前面有空格,所以这里 ...