【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 ...
随机推荐
- centos 安装php7 memcached扩展
在使用下面这种方式安装php7 memcached扩展时,先要安装好memcached服务器yum -y install php70w-pecl-memcached
- Apache Qpid Broker的安全机制
一. Apache Qpid的安全机制简介 Apache Qpid提供多种安全机制,包括用户认证.规则定制的授权.消息加密和数字签名等.Apache Qpid使用SASL框架实现对用户身份的认 ...
- UR#34. 多项式乘法
#34. 多项式乘法 统计 描述 提交 自定义测试 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+ ...
- oracle 错误代码表
ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...
- spring cloud 服务消费
Ribbon Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用. 当Ribbon与Eureka联合使用时,ribbonServerList会 ...
- POJ3680 Intervals —— 区间k覆盖问题(最小费用流)
题目链接:https://vjudge.net/problem/POJ-3680 Intervals Time Limit: 5000MS Memory Limit: 65536K Total S ...
- js实现网页多少秒后自动跳转到指定网址
在网上搜了一下,关于这个技术处理有多种方法,我只记下我在视频里学到的三种: 1.用一个response.sendRedirect("目标页面.jsp\.htm");实现直接跳转: ...
- SpringBoot启动的时候不去校验数据库连接配置是否正确
spring boot在启动的时候只会检查你是否配置了数据库连接, 而不会检测配置的是否正确 这样会出现的问题是: 只有在你使用数据库的时候才知道配置出错, 我们希望是在程序启动的时候就进行检查, 如 ...
- 输出文章段落首行空格缩进在IE和chrome显示不一致的问题
一般的编辑文章时,首行都缩进两格,而执行的操作则是一个tab键或者四个空格键,在html代码中体现的往往都是4个 然而我在输出时却发现了同样的html代码,在IE上显示的是缩进了一个字符,在chrom ...
- PHP empty()函数使用需要注意
在 PHP 5.5 之前,empty() 仅支持变量:任何其他东西将会导致一个解析错误.换言之,下列代码不会生效: empty(trim($name)). 作为替代,应该使用trim($name) = ...