【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 ...
随机推荐
- 链式mapreduce
在hadoop 中一个Job中可以按顺序运行多个mapper对数据进行前期的处理,再进行reduce,经reduce后的结果可经个经多个按顺序执行的mapper进行后期的处理,这样的Job是不会保存中 ...
- 安装sbt
http://www.scala-sbt.org/0.13/docs/zh-cn/Installing-sbt-on-Linux.html [root@hadoop1 target]# curl ht ...
- 用Java编写的http下载工具类,包含下载进度回调
HttpDownloader.java package com.buyishi; import java.io.FileOutputStream; import java.io.IOException ...
- 记录Linux常用命令
创建用户:useradd -m user1,-m表示同时创建用户主目录,默认会创建/home/user1目录 设置密码:passwd user1,然后就会出现设置密码的提示了 为新用户添加sudo权限 ...
- [转]GPS经纬度的表示方法及换算
想要认识GPS中的经纬度,就必须先了解GPS,知道经纬度的来源: 1. GPS系统组成 GPS是 Gloabal Positioning System 的简称,意为全球定位系统,主要由地面的控制站.天 ...
- jconsole工具检测堆内存变化的使用
jconsole将Java写的程序检测. 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使 ...
- pageHelper没有分页效果的问题
配置完全都没有问题 springboot pagehelper分页怎么都不管用 而且所有的信息记录全部都查出来了 解决方法: PageHelper.startPage(pageNum,pageSize ...
- MYSQL进阶学习笔记四:MySQL存储过程之定义条件,处理过程及存储过程的管理!(视频序号:进阶_11,12)
知识点五:MySQL存储过程之定义条件和处理过程及存储过程的管理(11,12) 定义条件和处理: 条件的定义和处理可以用来定义在处理过程中遇到的问题时相应的处理步骤. DECLARE CONTINUE ...
- ES6 解构赋值的常见用途,很强大
字符串 var [a,b,c,d,e] = "hello"; console.log(a); // h console.log(b); // e console.log(c); / ...
- 「NOIP2005」「Codevs1106」篝火晚会
题目描述 Description 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1 ...