Codeforces963B - Destruction of a Tree
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的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- Codeforces Round #475 (Div. 2) D. Destruction of a Tree
题意:给你一棵树, 只能删度数为偶数的点, 问你能不能将整个图删完, 如果能输入删除的顺序. 思路:对于一棵树来说, 如果里面的点的个数是偶数个则肯定不可能, 偶数个点有奇数条边,而你每次删只能删偶数 ...
- cf963b Destruction of a Tree
越靠近叶子越优先删掉 #include <iostream> #include <vector> #include <cstdio> using namespace ...
- 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 解 对于题目要求,显然一开始的树,要求度数为偶数的节点个数为奇数个,通过奇 ...
- Codeforces 963B Destruction of a Tree 思维+dfs
题目大意: 给出一棵树,每次只能摧毁有偶数个度的节点,摧毁该节点后所有该节点连着的边都摧毁,判断一棵树能否被摧毁,若能,按顺序输出摧毁的点,如果有多种顺序,输出一种即可 基本思路: 1)我一开始自然而 ...
- CodeForces475
A. Splits #include <cstdio> #include <cstdlib> #include <cmath> #include <cstri ...
- Codeforces Round #475 Div. 2 A B C D
A - Splits 题意 将一个正整数拆分成若干个正整数的和,从大到小排下来,与第一个数字相同的数字的个数为这个拆分的权重. 问\(n\)的所有拆分的不同权重可能个数. 思路 全拆成1,然后每次将2 ...
随机推荐
- .net代码获取节点以及读取属性
获取配置文件的节点,可以使用System.Configuration.ConfigurationManager.GetSection方法获取指定的节点,以sessionstate节点为例,如果需要获取 ...
- UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 先预处理出每个元素之前和之后相同元素出现的位置,就可以在O(1)的 ...
- appium---启动app
自动化测试是测试人员必备的一项技能,所谓的自动化就是通过代码完成了手工的操作,今天就总结下如何通过python启动app 环境条件 1.安装python:下载地址 2.安装JDK:下载地址 3.安装A ...
- 【转】实用API大全
有道翻译APIhttp://fanyi.youdao.com/openapi有道翻译API支持中英互译,同时获得有道翻译结果和有道词典结果(可能没有),返回格式为XML或JSON. 百度翻译APIht ...
- 计算机视觉2D几何基元及其变换介绍和OpenCV WarpPerspective源码分析
2D图像几何基元 一般的,表示一个2d几何基元只用两个维度(比如x,y)就可以表示了,但是在计算机视觉研究中,为了统一对2d几何基元的操作(后面讲到的仿射,透射变换),一般会以增广矢量的方式表示几何基 ...
- C++:100阶乘数组输出
#include <iostream> using namespace std; int main(){ int i =1; int a[2048]={0}; while(i !=101) ...
- Laravel中chunk组块结果集处理
如果你需要处理成千上万个 Eloquent 结果,可以使用 chunk 命令.chunk 方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理.使用 chunk 方法能够在处 ...
- 收集的免费API接口
1.IP地址调用接口 这是淘宝的IP调用API http://ip.taobao.com/service/getIpInfo.php?ip=$ip 返回值:{"code":0,&q ...
- python操作日志的封装
前言 曾经转载过一篇关于python日志模块logging的详解 https://www.cnblogs.com/linuxchao/p/linuxchao-log.html, 虽然这篇文章是别人写的 ...
- OpenCV中的图像形态学转换
两个基本的形态学操作是腐蚀和膨胀.他们的变化构成了开运算,闭运算,梯度等.下面以这张图为例 1.腐蚀 这个操作会把前景物体的边界腐蚀掉. import cv2 import numpy as np i ...