[CODE FESTIVAL 2016]Problem on Tree
题意:给一棵树,对于一个满足以下要求的序列$v_{1\cdots m}$,求最大的$m$
对$\forall1\leq i\lt m$,路径$(v_i,v_{i+1})$不包含$v$中除了$v_i,v_{i+1}$以外的任何点
这个题好神啊...根本做不动
如果一个度数$\geq3$的点$x\in v$,那么它的$\geq3$个子树中只能有至多$2$个子树包含$v$中节点,否则矛盾,所以我们可以找它的一个不包含$v$中节点的子树,并把这个节点移到这个子树中的一个叶子里,移动后$v$仍然满足要求
所以最优解只能包含度数$\leq2$的点
先对叶子讨论,可以证明最优解一定包含叶子:如果一个叶子$x$不在$v$内,那么我们从$x$开始走,如果走到度数$=2$的节点$y$,如果$y\in v$,直接把它移到$x$即可,否则继续往外走;如果走到度数$\geq3$的点$y$,如果它只有一个子树包含$v$中节点,那么继续往那个子树走,否则可以直接把$x$在合适的位置插入$v$中并使得$v$仍然满足要求
最后讨论度数$=2$的点,如果一个度数$=2$的点$x\in v$,把它删掉后树被分成两部分,一部分的点在$v$中的位置在$x$之前,另一部分的点在$v$中的位置在$x$之后,所以所有被选择的度数$=2$的点一定在一条链上
于是DP找出包含最多度数$=2$的点的一条链,这些点的数量加上叶子个数就是答案
#include<stdio.h>
#include<algorithm>
using namespace std;
int h[100010],nex[200010],to[200010],M;
void add(int a,int b){
M++;
to[M]=b;
nex[M]=h[a];
h[a]=M;
}
int d[100010],v[100010],f[100010],g[100010];
void dfs(int fa,int x){
f[x]=g[x]=v[x];
for(int i=h[x];i;i=nex[i]){
if(to[i]!=fa){
dfs(x,to[i]);
f[x]=max(f[x],max(g[x]+g[to[i]],f[to[i]]));
g[x]=max(g[x],g[to[i]]+v[x]);
}
}
}
int main(){
int n,i,x,y,s;
scanf("%d",&n);
for(i=1;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
d[x]++;
d[y]++;
}
s=0;
for(i=1;i<=n;i++){
s+=d[i]==1;
v[i]=d[i]==2;
}
dfs(0,1);
printf("%d",s+f[1]);
}
[CODE FESTIVAL 2016]Problem on Tree的更多相关文章
- Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution
Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution 题目链接:https://atcoder.jp/contests/cf16- ...
- 【AtCoder】CODE FESTIVAL 2016 qual A
CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...
- 【AtCoder】CODE FESTIVAL 2016 qual B
CODE FESTIVAL 2016 qual B A - Signboard -- #include <bits/stdc++.h> #define fi first #define s ...
- 【AtCoder】CODE FESTIVAL 2016 qual C
CODE FESTIVAL 2016 qual C A - CF -- #include <bits/stdc++.h> #define fi first #define se secon ...
- Atcoder CODE FESTIVAL 2016 qual C 的E题 Encyclopedia of Permutations
题意: 对于一个长度为n的排列P,如果P在所有长度为n的排列中,按照字典序排列后,在第s位,则P的value为s 现在给出一个长度为n的排列P,P有一些位置确定了,另外一些位置为0,表示不确定. 现在 ...
- @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...
- CODE FESTIVAL 2016 qualA Grid and Integers
划年代久远的水 题意 有一个R*C的棋盘,要求在每个格子上填一个非负数,使得对任意一个2*2的正方形区域,左上角和右下角的数字之和等于左下角和右上角的数字之和.有一些格子已经被填上了数字,问现在能否满 ...
- [CODE FESTIVAL 2016]Encyclopedia of Permutations
题意:给定一个排列,其中有可能有一些未确定的数,求出所有可能的排列的排名之和 首先我们要知道怎么算一个给定排列的排名,设它为$p_{1\cdots n}$ 排名即为比它小的排列数$+1$,对于每一个比 ...
- [CODE FESTIVAL 2016]Distance Pairs
题意:有一个未知的边权为$1$的图,给定所有点到$1$的最短路$a_i$和到$2$的最短路$b_i$,问是否存在这样的图,如果存在,问图中最少有多少条边 先考虑$a_i$,有$a_1=0,a_i\ne ...
随机推荐
- JavaScript中innerText和innerHTML的区别
案例 <html> <head> <meta http-equiv="Content-Type" content="text/html;ch ...
- django【ORM】model字段类型
1.AutoField 一个自增的IntegerField,一般不直接使用,Django会自动给每张表添加一个自增的primary key. 2.BigIntegerField 64位整数, -922 ...
- 关于linux系统如何实现fork的研究(二)【转】
转自:http://www.aichengxu.com/linux/7166015.htm 本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 前一篇关于li ...
- (转)USB体系结构
转载地址:http://blog.ednchina.com/zenhuateng/203584/Message.aspx USB总线接口层:物理连接.电气信号环境.信息包传输机制:主机一方由USB主控 ...
- PyQt: eg2
#coding:utf-8 from __future__ import division import sys from math import * from PyQt4 import QtCore ...
- ECMA6
let关键字 用来替代var 的关键字,不能重复定义一个变量 举例: for(var i=0; i<5; i++){ setTimeout(function(){ ...
- javascript练习(二)
案例 输出100个数字 案例 打印100以内 7的倍数 案例 打印100以内的奇数 案例 打印100以内所有偶数的和 打印图形 ********** ********** ********** ...
- tensorflow运行出现错误 : ImportError: Could not find 'cudart64_90.dll'.
安装 tensorflow-gpu 版本后,需要安装相应的 CUDA 和 cuDNN 注意版本问题:tensorflow-gpu 1.7以及之后的版本要安装 CUDA 8.0 以上的版本,tf 1.7 ...
- LoadRunner11设置场景百分比模式完成多台客户端压力测试
LoadRunner11用的不多,之前大部分的时候是用LoadRunner9.5,主要原因是由于担心新版本的稳定性,不过在Windows7系统下就不得不用LoadRunner11了,不过稳定不稳定,还 ...
- 第七章:Mapping插件
Mapping插件 Knockout设计成允许你使用任何JavaScript对象作为view model.必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元 ...