【Helvetic Coding Contest 2018】B2. Maximum Control (medium)
Description
传送门(翻译就别想了,本人英语太垃圾)
Solution
设ans[i]为设置i个船时能控制的最多星球数(看到这你可能因为是dp,然而我可以很负责地告诉你是假的)
首先一个显然的结论,ans[1]=1,ans[2]=树的直径长
有由B1题的提示我们也可以得到一个显然的结论,要使控制数最多,其实只有叶子节点是有用的
如果这样,那就比较容易了。
我们可以先找出树的直径,然后从直径上的点向外扩展,记录每个节点的深度(叶子节点深度为一个常数,反正只要一样又不会爆类型就无所谓)
为什么这样呢?
因为在选择时,当该节点被控制的时候,一定是以该节点为根的子树深度最大的叶子节点被放了船(这样才会使得答案最大)
那最后这步就较为容易了,枚举直径上的点,向外扩展,每扩展到一个新节点,就将该节点能控制的星球数+1,在将这个数字向该节点深度最大的儿子传递,向其他儿子传递的的数字即为0(或1主要看如何实现,如果计数从叶子
节点+1的话就0,否则1,讲的不清楚,反正大家都懂对吧,不然看下代码也能懂的)
最后必然每个叶子节点都有自己能控制的星球数且这些控制互不干扰,并且一定最优
那么我们只需要sort一下,然后贪心计算答案就好了
其实本题不找直径也行,只需把直径的一个端点找到,然后情况其实是可以合并在一起的
比赛时就是这样打,本来以为是乱搞过了,结果一看题解跟我想法一样也是很神奇233
代码~~~
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
std::queue<int> q;
struct r{
int last,to;
}e[];
bool v[];
int d[],num=,fa[],ans[],a,t,b,n,head[],res,p,dep[],son[],val[];
void add(int u,int vv){e[num].to=vv,e[num].last=head[u];head[u]=num++;}
void bfs(int u){
q.push(u);
memset(d,,sizeof d);
d[u]=;
while (!q.empty()){
int now=q.front(),y;q.pop();
for (int i=head[now];i;i=e[i].last)if (d[y=e[i].to]>d[now]+){
d[y]=d[now]+;
fa[y]=now;
q.push(y);
if (d[y]>res)res=d[y],p=y;
}
}
}
void dfs(int u,int f){
for (int i=head[u];i;i=e[i].last)if (!v[e[i].to]&&e[i].to!=f){
dfs(e[i].to,u);
if (dep[e[i].to]>=dep[u])dep[u]=dep[e[i].to]+,son[u]=e[i].to;
}
}
void dfs1(int u,int s,int f){
bool flag=;
for (int i=head[u];i;i=e[i].last)if (!v[e[i].to]&&e[i].to!=f){
if (e[i].to!=son[u])dfs1(e[i].to,,u);
else dfs1(e[i].to,s+,u);
flag=;
}
if (!flag&&!v[u])val[++t]=s;
}
bool cmp(int a,int b){return a>b;}
int main(){
scanf("%d",&n);
if (n==){
printf("1\n");
return ;
}
int u,vv;
for (int i=;i<n;i++)scanf("%d%d",&u,&vv),add(u,vv),add(vv,u);
ans[]=;
bfs();int st=p;res=;
bfs(p);int ed=p;
while (st!=ed){
v[ed]=;
ed=fa[ed];
}
v[st]=;
ans[]=res+;
ed=p;
while (st!=ed){
dfs(ed,-);
dfs1(ed,,-);
ed=fa[ed];
}
std::sort(val+,val+t+,cmp);
for (int i=;i<=t;i++)ans[i+]=ans[i+]+val[i];
for (int i=t+;i<=n;i++)ans[i]=n;
for (int i=;i<=n;i++)printf("%d ",ans[i]);
}
【Helvetic Coding Contest 2018】B2. Maximum Control (medium)的更多相关文章
- Helvetic Coding Contest 2018 online mirror (teams allowed, unrated)F3 - Lightsabers (hard)
题意:n个数字1-m,问取k个组成的set方案数 题解:假设某个数出现k次,那么生成函数为\(1+x+...+x^k\),那么假设第i个数出现ai次,结果就是\(\sum_{i=1}^m(1+x+.. ...
- Helvetic Coding Contest 2019 差A3 C3 D2 X1 X2
Helvetic Coding Contest 2019 A2 题意:给一个长度为 n 的01序列 y.认为 k 合法当且仅当存在一个长度为 n 的01序列 x,使得 x 异或 x 循环右移 k 位的 ...
- Maximum Control (medium) Codeforces - 958B2
https://codeforces.com/contest/958/problem/B2 题解:https://www.cnblogs.com/Cool-Angel/p/8862649.html u ...
- 【Codeforces】Helvetic Coding Contest 2017 online mirror比赛记
第一次打ACM赛制的团队赛,感觉还行: 好吧主要是切水题: 开场先挑着做五道EASY,他们分给我D题,woc什么玩意,还泊松分布,我连题都读不懂好吗! 果断弃掉了,换了M和J,然后切掉了,看N题: l ...
- 【Asia Yokohama Regional Contest 2018】Arithmetic Progressions
题目大意:给定 N(1<N<=5000) 个不同元素组成的集合,求从中选出若干数字组成的等差数列最长是多少. 题解:直接暴力有 \(O(n^3)\) 的算法,即:枚举等差数列的前两个值,再 ...
- 2019.04.04 第二次训练 【ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018)】
题目链接:https://codeforces.com/gym/101853 A: ✅ B: (二分图匹配) https://blog.csdn.net/qq_41997978/article/det ...
- 【DP-最大子串和】PAT1007. Maximum Subsequence Sum
1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- 【AtCoder Regular Contest 082】Derangement
[链接]点击打开链接 [题意] 在这里写题意 [题解] 贪心. 连续一块的p[i]==i的话,对答案的贡献就应该为(这个连续块的长度+1)/2; 长度为1的也正确. (也即两两相邻的互换位置.) [错 ...
- Helvetic Coding Contest 2019 online mirror (teams allowed, unrated)
http://codeforces.com/contest/1184 A1 找一对整数,使x^x+2xy+x+1=r 变换成一个分式,保证整除 #include<iostream> #in ...
随机推荐
- 基于node+koa2+mongodb实现简单的导航管理系统
基于node+koa2+mongodb实现简单的导航管理系统 项目说明 本项目gitbub地址 https://github.com/xuess/nav-admin,喜欢请star 基于node 实现 ...
- day 18 面向对象的 继承
一.概念性知识 面向对象的三大特征: 继承,多态,封装 继承是创建新类的一种方法,在python中,新建的类可以继承一个或多个父类,父类称作基类或超类,新建的类又称作派生类或子类. 继承的好处 ...
- Latex 5: LaTeX资料下载
转: LaTeX资料下载 最全latex资料下载 LaTeX命令速查手册1
- iOS 常用的几个第三方库
网络通信 1.ASIHTTPRequest 这是一个经典的老库,功能完全而强大,但已经停止更新很久了(iOS5.0停止更新,但是我最近看github上这个项目有新改动).在不同iOS版本上略微有一些小 ...
- Spring Boot 整合Servlet
冷知识,几乎用不到 在spring boot中使用Servlet有两种实现方法: 方法一: 正常创建servlet,然后只用注解@ServletComponentScan package clc.us ...
- 利用Python3的dpkt库进行ARP扫描
背景 正在学习网络协议,用Python写起来方便点,可以快速熟悉协议本身,也给自己补充一些Python库. 偶然看到这篇文章,讲的是Python发ARP包,发现是Python2的,这里改了一下,用Py ...
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A (A - Children of the Candy Corn) ht ...
- pyspark 日期格式
1. 获取当前日期 from pyspark.sql.functions import current_date spark.range(3).withColumn('date',current_da ...
- Mother's Milk
链接 分析:我们用vis[i][j][k]来记录A,B,C三个状态是否被访问过,同时用s[i]来记录C的所有可能值,当i==0时,如果j合法,则标记s[k]=1,最后统计所有为1的s即可 /* PRO ...
- UVA 11174 Stand in a Line 树上计数
UVA 11174 考虑每个人(t)的所有子女,在全排列中,t可以和他的任意子女交换位置构成新的排列,所以全排列n!/所有人的子女数连乘 即是答案 当然由于有MOD 要求逆. #include & ...