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. 使用EventLog组件向本机现有日志中添加条目

    实现效果: 知识运用: EventLog组件的MachineName属性 //获取或设置在其上读取或写入事件的计算机名称 public string MachineName  {get;set; } ...

  2. k8s1.13.0二进制部署-flannel网络(二)

    Flannel容器集群网络部署 Overlay Network:覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来.VXLAN:将源数据包封装到UDP中,并使用基础网 ...

  3. linux - centos7 开放防火墙端口的新方式

    CentOS 升级到7之后,发现无法使用iptables控制Linuxs的端口, google之后发现Centos 7使用firewalld代替了原来的iptables. 下面记录如何使用firewa ...

  4. Linux运维笔记--第四部

    第四部 3. Linux扩展正则表达式实战 扩展的正则表达式:ERE(主要用于egrep或grep  -E) +      重复一个或一个以上前面的字符. (*是0或多个) ?     重复0个或一个 ...

  5. ios sinaweibo 客户端(三)

    这个页面要讲述的是用户的粉丝列表,下面是效果图: 可以看到这个视图明显也是一个tableview,在每一个cell中包含的有三个部分的内容:粉丝头像image,粉丝昵称label,我和粉丝之间的相互关 ...

  6. 私有DockerHub搭建

    docker简介 一个开源的应用容器引擎,可以用来打包程序,可以包入依赖环境,这样只需要提供docker image即可,类似于虚拟机,但是更轻量级. 几个概念: Paas,platform as a ...

  7. angular5自适应窗口大小

    import {AfterViewInit, Directive, ElementRef, HostBinding, HostListener, Inject, Input, Renderer2} f ...

  8. GoF23种设计模式之行为型模式之责任链模式

    一.概述 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并且沿着这条链传递请求,直到有一个对象处理它为止.其设计思想是:给对多个对象处理一个请求的机会, ...

  9. python getopt模块使用方法

    python中 getopt 模块,是专门用来处理命令行参数的 getop标准格式: 函数getopt(args, shortopts, longopts = []) shortopts 是短参数   ...

  10. Letters CodeForces - 978C (二分)

    Time limit4000 ms Memory limit262144 kB There are nn dormitories in Berland State University, they a ...