题目链接:https://vjudge.net/problem/Gym-101612H

知识点:  贪心

解题思路:

  我们称除了以 \(1\) 号结点为根的树以外的树为 “其他树”。

  对于每一棵树,先自底向上贪心地组队,记录下每一棵其他树没有组队的结点数及根结点是否有组队,然后对其他树进行排序(排序优先法则请参考 \(cmp()\) 函数)。

  对于根结点已经有组队的树,我们直接让根结点连接 \(1\) 号结点即可;对于根结点没有组队的树,我们可以让根结点连现有的树里面没有组队的结点(如果现有的树里面的结点都已经有组队了,则直接连接到 \(1\) 号结点)。这部分我选择用一个 \(queue\) 来维护现有的树中没有组队的结点。

AC代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e5+;
  4.  
  5. struct Node{
  6. int ID;
  7. bool HeadHave;
  8. int NoHave;
  9. };
  10. vector<int> to[maxn];
  11. bool rot[maxn],have[maxn];
  12. vector<Node> head;
  13. queue<int> notn;
  14.  
  15. void dfs(int s){
  16. if(to[s].empty())
  17. return;
  18. for(int i=;i<to[s].size();i++){
  19. dfs(to[s][i]);
  20. if(!have[to[s][i]]&&!have[s])
  21. have[s]=have[to[s][i]]=true;
  22. }
  23. }
  24. void dfs1(int s){
  25. if(!have[s]) notn.push(s);
  26. for(int i=;i<to[s].size();i++){
  27. dfs1(to[s][i]);
  28. }
  29. }
  30. bool cmp(const Node &a,const Node &b){
  31. if(a.HeadHave&&!b.HeadHave) return true;
  32. else if(!a.HeadHave&&b.HeadHave) return false;
  33. else{
  34. if(a.NoHave>b.NoHave) return true;
  35. else return false;
  36. }
  37. }
  38. int dfs2(int s){
  39. int ret=;
  40. if(!have[s]) ret++;
  41. for(int i=;i<to[s].size();i++)
  42. ret+=dfs2(to[s][i]);
  43. return ret;
  44. }
  45.  
  46. int ans[maxn];
  47. int main(){
  48. freopen("hidden.in","r",stdin);
  49. freopen("hidden.out","w",stdout);
  50. int n;
  51. scanf("%d",&n);
  52. memset(rot,true,sizeof(rot));
  53. for(int i=;i<n;i++){
  54. int x;
  55. scanf("%d",&x);
  56. if(x){
  57. to[x].push_back(i+);
  58. ans[i+]=x;
  59. rot[i+]=false;
  60. }
  61. }
  62. Node tmp;
  63. for(int i=;i<=n;i++){
  64. if(rot[i]){
  65. dfs(i);
  66. if(i!=){
  67. tmp.HeadHave=have[i];
  68. tmp.ID=i;
  69. tmp.NoHave=dfs2(i);
  70. head.push_back(tmp);
  71. }
  72. }
  73. }
  74. sort(head.begin(),head.end(),cmp);
  75.  
  76. dfs1();
  77. for(int i=;i<head.size();i++){
  78. int id=head[i].ID;
  79. if(have[id]){
  80. ans[id]=;
  81. dfs1(id);
  82. } else{
  83. if(notn.size()){
  84. int x=notn.front();
  85. notn.pop();
  86. have[x]=have[id]=true;
  87. ans[id]=x;
  88. dfs1(id);
  89. } else{
  90. ans[id]=;
  91. dfs1(id);
  92. }
  93. }
  94. }
  95. int has=;
  96. for(int i=;i<=n;i++){
  97. if(have[i]) has++;
  98. }
  99. printf("%d\n",has/);
  100. for(int i=;i<=n;i++){
  101. if(i!=) printf(" ");
  102. printf("%d",ans[i]);
  103. }
  104. printf("\n");
  105.  
  106. return ;
  107. }

Gym101612H Hidden Supervisors的更多相关文章

  1. NEERC训练实录

    听说这里可以做一些idea比较好的题.. 那就做做吧 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest A. Auxiliary Proj ...

  2. 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest

    A. Auxiliary Project 完全背包. #include<stdio.h> #include<iostream> #include<string.h> ...

  3. 表单reset无法重置hidden的解决方案

    方法一:用text代替hidden,设置text隐藏 <input id="id" name="id" style="display: none ...

  4. overflow:hidden与margin:0 auto之间的冲突

    相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.

  5. 移动端浏览器body的overflow:hidden并没有什么作用

    今天突然遇到一个问题,使用li模拟select,但是碰到一个很尴尬的问题,给body加了overflow:hidden,但是body并没有禁止滚动条,滚动条依旧顺滑. <!DOCTYPE htm ...

  6. display:none与visible:hidden的区别 slideDown与

    display:none与visible:hidden的区别 display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被 ...

  7. 关于display:none 和visibility:hidden 的区别

    1.占据空间 :none 隐藏后不占据空间 visibility占据空间 2.回流与渲染:none产生回流与渲染 ? 可以通过oprea中的Profiler 工具测试. 关于回流的详细介绍:http: ...

  8. toArray(),toJson(),hidden([ ]),visible([ ])

    toArray() 转换为数组,hidden()不输出的字段 public function index(){ $user = model('User'); $data = $user::)-> ...

  9. asp.net Application、 Session、Cookie、ViewState、Cache、Hidden 的区别

    这些对象都是用来保存信息的,包括用户信息,传递值的信息,全局信息等等.他们之间的区别: 1.Application对象 Application用于保存所有用户的公共的数据信息,如果使用Applicat ...

随机推荐

  1. 基于java的OpenCV安装和配置

    目录 OpenCV简介 OpenCV下载安装 eclipse里引用jar包和配置 OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Window ...

  2. python django mysql配置

    1    django默认支持sqlite,mysql, oracle,postgresql数据库.  <1> sqlite django默认使用sqlite的数据库,默认自带sqlite ...

  3. 暑期档追剧指南曝光 HUAWEI nova 2系列再放实用三大招

    火辣辣的夏季来啦,每年这时火热的不只天气,还有暑期黄金档影视剧的激烈争夺战.今年有<择天记>收视率珠玉在前,<欢乐颂2>更是引发全民追剧热潮,"小花"赵丽颖 ...

  4. 关于IE8上传文件的一些问题

    问题1: IE8下上传完文件后,对后台返回的JSON格式的数据,浏览器提示了下载该文件. 原因是因为IE8还不支持'application/json"类型的响应. 解决方法将后台返回的JSO ...

  5. Radware:上周五美国大规模DDoS攻击是如何发生的

    10月21日上午,Dyn遭受到拒绝服务(DoS)攻击,造成了托管DNS网络的中断.成千上万的网站因此变得不可访问,其中包括Amazon EC2.当天晚些时候,当攻击者发起第二轮针对Dyn DNS系统的 ...

  6. Windows 10 MSDN官方原版ISO镜像(简体中文)下载

    http://www.heu8.com/2800.html 硬件要求如下:处理器:1 GHz 或更快的处理器或 SoC RAM:1 GB(32 位)或 2 GB(64 位) 硬盘空间:16 GB(32 ...

  7. nodeJS生成xlsx以及设置样式

    参考: https://www.npmjs.com/package/xlsx-style https://www.jianshu.com/p/877631e7e411 https://sheetjs. ...

  8. 图像处理之OpenCV - 缩放/旋转/裁剪/加噪声/高斯模糊

    Github地址 @ 缩放 void cv::resize ( InputArray src, OutputArray dst, Size dsize, , , int interpolation = ...

  9. Axios 拦截器中添加headers 属性

    描述: 已在网上查过怎么在 interceptors 中对header进行处理,// http request 拦截器 axios.interceptors.request.use( config = ...

  10. 清北学堂—2020.3NOIP数学精讲营—Day 1 morning 重点笔记

    qbxt Day 1 morning 重点笔记 --2020.3.8 济南 主讲:钟皓曦 1 正数%负数==正数 负数%正数==负数 负数%负数==负数 a%b的答案的符号取决于a的符号. 2 快速幂 ...