Gym101612H Hidden Supervisors
题目链接:https://vjudge.net/problem/Gym-101612H
知识点: 贪心
解题思路:
我们称除了以 \(1\) 号结点为根的树以外的树为 “其他树”。
对于每一棵树,先自底向上贪心地组队,记录下每一棵其他树没有组队的结点数及根结点是否有组队,然后对其他树进行排序(排序优先法则请参考 \(cmp()\) 函数)。
对于根结点已经有组队的树,我们直接让根结点连接 \(1\) 号结点即可;对于根结点没有组队的树,我们可以让根结点连现有的树里面没有组队的结点(如果现有的树里面的结点都已经有组队了,则直接连接到 \(1\) 号结点)。这部分我选择用一个 \(queue\) 来维护现有的树中没有组队的结点。
AC代码:
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 1e5+;
- struct Node{
- int ID;
- bool HeadHave;
- int NoHave;
- };
- vector<int> to[maxn];
- bool rot[maxn],have[maxn];
- vector<Node> head;
- queue<int> notn;
- void dfs(int s){
- if(to[s].empty())
- return;
- for(int i=;i<to[s].size();i++){
- dfs(to[s][i]);
- if(!have[to[s][i]]&&!have[s])
- have[s]=have[to[s][i]]=true;
- }
- }
- void dfs1(int s){
- if(!have[s]) notn.push(s);
- for(int i=;i<to[s].size();i++){
- dfs1(to[s][i]);
- }
- }
- bool cmp(const Node &a,const Node &b){
- if(a.HeadHave&&!b.HeadHave) return true;
- else if(!a.HeadHave&&b.HeadHave) return false;
- else{
- if(a.NoHave>b.NoHave) return true;
- else return false;
- }
- }
- int dfs2(int s){
- int ret=;
- if(!have[s]) ret++;
- for(int i=;i<to[s].size();i++)
- ret+=dfs2(to[s][i]);
- return ret;
- }
- int ans[maxn];
- int main(){
- freopen("hidden.in","r",stdin);
- freopen("hidden.out","w",stdout);
- int n;
- scanf("%d",&n);
- memset(rot,true,sizeof(rot));
- for(int i=;i<n;i++){
- int x;
- scanf("%d",&x);
- if(x){
- to[x].push_back(i+);
- ans[i+]=x;
- rot[i+]=false;
- }
- }
- Node tmp;
- for(int i=;i<=n;i++){
- if(rot[i]){
- dfs(i);
- if(i!=){
- tmp.HeadHave=have[i];
- tmp.ID=i;
- tmp.NoHave=dfs2(i);
- head.push_back(tmp);
- }
- }
- }
- sort(head.begin(),head.end(),cmp);
- dfs1();
- for(int i=;i<head.size();i++){
- int id=head[i].ID;
- if(have[id]){
- ans[id]=;
- dfs1(id);
- } else{
- if(notn.size()){
- int x=notn.front();
- notn.pop();
- have[x]=have[id]=true;
- ans[id]=x;
- dfs1(id);
- } else{
- ans[id]=;
- dfs1(id);
- }
- }
- }
- int has=;
- for(int i=;i<=n;i++){
- if(have[i]) has++;
- }
- printf("%d\n",has/);
- for(int i=;i<=n;i++){
- if(i!=) printf(" ");
- printf("%d",ans[i]);
- }
- printf("\n");
- return ;
- }
Gym101612H Hidden Supervisors的更多相关文章
- NEERC训练实录
听说这里可以做一些idea比较好的题.. 那就做做吧 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest A. Auxiliary Proj ...
- 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
A. Auxiliary Project 完全背包. #include<stdio.h> #include<iostream> #include<string.h> ...
- 表单reset无法重置hidden的解决方案
方法一:用text代替hidden,设置text隐藏 <input id="id" name="id" style="display: none ...
- overflow:hidden与margin:0 auto之间的冲突
相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.
- 移动端浏览器body的overflow:hidden并没有什么作用
今天突然遇到一个问题,使用li模拟select,但是碰到一个很尴尬的问题,给body加了overflow:hidden,但是body并没有禁止滚动条,滚动条依旧顺滑. <!DOCTYPE htm ...
- display:none与visible:hidden的区别 slideDown与
display:none与visible:hidden的区别 display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被 ...
- 关于display:none 和visibility:hidden 的区别
1.占据空间 :none 隐藏后不占据空间 visibility占据空间 2.回流与渲染:none产生回流与渲染 ? 可以通过oprea中的Profiler 工具测试. 关于回流的详细介绍:http: ...
- toArray(),toJson(),hidden([ ]),visible([ ])
toArray() 转换为数组,hidden()不输出的字段 public function index(){ $user = model('User'); $data = $user::)-> ...
- asp.net Application、 Session、Cookie、ViewState、Cache、Hidden 的区别
这些对象都是用来保存信息的,包括用户信息,传递值的信息,全局信息等等.他们之间的区别: 1.Application对象 Application用于保存所有用户的公共的数据信息,如果使用Applicat ...
随机推荐
- 基于java的OpenCV安装和配置
目录 OpenCV简介 OpenCV下载安装 eclipse里引用jar包和配置 OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Window ...
- python django mysql配置
1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使用sqlite的数据库,默认自带sqlite ...
- 暑期档追剧指南曝光 HUAWEI nova 2系列再放实用三大招
火辣辣的夏季来啦,每年这时火热的不只天气,还有暑期黄金档影视剧的激烈争夺战.今年有<择天记>收视率珠玉在前,<欢乐颂2>更是引发全民追剧热潮,"小花"赵丽颖 ...
- 关于IE8上传文件的一些问题
问题1: IE8下上传完文件后,对后台返回的JSON格式的数据,浏览器提示了下载该文件. 原因是因为IE8还不支持'application/json"类型的响应. 解决方法将后台返回的JSO ...
- Radware:上周五美国大规模DDoS攻击是如何发生的
10月21日上午,Dyn遭受到拒绝服务(DoS)攻击,造成了托管DNS网络的中断.成千上万的网站因此变得不可访问,其中包括Amazon EC2.当天晚些时候,当攻击者发起第二轮针对Dyn DNS系统的 ...
- Windows 10 MSDN官方原版ISO镜像(简体中文)下载
http://www.heu8.com/2800.html 硬件要求如下:处理器:1 GHz 或更快的处理器或 SoC RAM:1 GB(32 位)或 2 GB(64 位) 硬盘空间:16 GB(32 ...
- nodeJS生成xlsx以及设置样式
参考: https://www.npmjs.com/package/xlsx-style https://www.jianshu.com/p/877631e7e411 https://sheetjs. ...
- 图像处理之OpenCV - 缩放/旋转/裁剪/加噪声/高斯模糊
Github地址 @ 缩放 void cv::resize ( InputArray src, OutputArray dst, Size dsize, , , int interpolation = ...
- Axios 拦截器中添加headers 属性
描述: 已在网上查过怎么在 interceptors 中对header进行处理,// http request 拦截器 axios.interceptors.request.use( config = ...
- 清北学堂—2020.3NOIP数学精讲营—Day 1 morning 重点笔记
qbxt Day 1 morning 重点笔记 --2020.3.8 济南 主讲:钟皓曦 1 正数%负数==正数 负数%正数==负数 负数%负数==负数 a%b的答案的符号取决于a的符号. 2 快速幂 ...