【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 ...
随机推荐
- openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))
1)概述 管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号.所有这些数据流在运行的时候自动的流过管道. 2) 缓冲区(Buffers) 缓冲区包 ...
- java使用默认线程池踩过的坑(三)
云智慧(北京)科技有限公司 陈鑫 重新启动线程池 TaskManager public class TaskManager implements Runnable { -.. public TaskM ...
- LeetCode(3)题解: Longest Palindromic Substring
https://leetcode.com/problems/longest-palindromic-substring/ 题目: Given a string S, find the longest ...
- 有遍历struct中字段信息的函数或方法
例:struct a{int a;char b[10];double c;}; 在程序中只知道一个结构 a 的指针, 有没有函数能通过结构的名字 和 指向结构的指针 随次得到 结构中的变量类型 和 变 ...
- java File文件操作共用方法整理
package org.jelly.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io ...
- Cooperating sequential processes》,这篇论文提出了大名鼎鼎的概念信号量,Java里面用于线程同步的wait/notify也是信号量的一种实现。
闲话高并发的那些神话,看京东架构师如何把它拉下神坛 https://mp.weixin.qq.com/s/lAqn8CfSRta9iSvOR1Le6w
- Java programming language compiler
https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html\ javac - Java programming l ...
- Java中的final具体解释以及用途实战
浅析Java中的finalkeyword 谈到finalkeyword,想必非常多人都不陌生.在使用匿名内部类的时候可能会经经常使用到finalkeyword. 另外.Java中的String类就是一 ...
- Android 的assets文件资源与raw文件资源读取
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zpf8861/article/details/34504183 res/raw和assets的同 ...
- local_irq_disable
local_irq_disable 仅仅是 设置 当前CPU 的中断屏蔽位 disable_irq 是禁用 全部cpu 中断(只是当前irq) 如果你要禁止所有的中断该怎么办? 在2.6内核中,可以通 ...