【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 ...
随机推荐
- Linq To Sql进阶系列(六)用object的动态查询与保存log篇
动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处.而Linq的推出,是为了弥补编程中的 Data != Object 的问题.我们又该如何实现用object的动 ...
- eclipse通过maven建立java se工程配置log4j,打包成zip,将jar包和配置文件分开,并以bat和sh文件启动java程序
一.新建maven的java工程 1.eclipse里file-new-other,选择maven Project 2.选中 Use default Workspace location,然后 nex ...
- 将线上服务器生成的日志信息实时导入kafka,采用agent和collector分层传输,app的数据通过thrift传给agent,agent通过avro sink将数据发给collector,collector将数据汇集后,发送给kafka
记flume部署过程中遇到的问题以及解决方法(持续更新) - CSDN博客 https://blog.csdn.net/lijinqi1987/article/details/77449889 现将调 ...
- iOS中城市定位功能的实现
引入框架:CoreLocation .h文件 引入CoreLocation/CoreLocation.h @interface WeatherViewController :UIViewControl ...
- [FAQ04776]如何默认打开user版本 debug 选项, 默认打开adb 连接【转】
本文转载自:http://blog.csdn.net/thinkinwm/article/details/24865933 Description] 如何默认打开user 版本的USB debug 选 ...
- iOS NSString拼接字符串
NSString* str_C; // 结果字符串NSString* str_A, str_B; //已存在的字符串,需要将str_A和str_B连接起来 //方法1 str_C = [NSStrin ...
- 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径
Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...
- javascript之存储数据-cookie,localStorage,sessionStorage
cookie: 存储一些简单的数据,以文本形式放到本地,大小4kb 存储:document.cookie='name=value' 取值:document.cookie(字符串) 期限:expires ...
- js dom element 属性整理(原创)
最近去几家公司面试,发现大多数时候面试的内容考的都是原生的js语法和属性,所以我决心整理一下原生的dom元素的属性. 首先,我我们需要获取一个element元素 <li id="2&q ...
- 禁用选择文本功能user-select
有时候,我们为了用户体验,需要禁用选择文本功能. 这需要用到一个CSS属性:user-select,user-select的文档点这里 user-select有两个值:none:用户不能选择文本tex ...