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 ...
随机推荐
- 2 个案例带你迅速入门 Python Flask 框架
Flask 是 python 中非常流行的一个 web 框架,容易学习.这篇文章主要通过 2 个实际案例讲解 Flask 如何使用.第一个例子是实现一个调用公交车到站信息的接口服务:第二个例子是通过接 ...
- Vue项目中设置每个单页面的标题
两种实现方法,第一种方法引入插件,第二种为编程方式实现(推荐) 首先在路由文件index.js中给每个单页面路由添加title routes: [{ path: '/', name: ...
- ST函数(ST表)RMQ O(1)查询 离线
ST算法是基于倍增的动态规划算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&l ...
- RF(元素定位)
1.id 定位 Open Browser https://www.baidu.com gc Input Text id=kw selenium #注意 id 的值 kw 没有用引号括起来 Close ...
- nginx的数据结构集合(随时更新)
在学习nginx的时候,因为其数据结构略多,看过后一般就忘记了.所以边学习边记录在这里吧,方便以后查看. ngx_buf_t:缓冲区结点 1: typedef struct ngx_buf_s ngx ...
- Jenkins+Ansible+Gitlab自动发布/回滚Spring项目
一.实现方法流程图 流程图如下:代码托管在本地GitLab上(为了复现整套流水线,我直接使用了GitHub,懒得再搭建GitLab),开发完成后提交代码到代码仓库,[自动]触发Jenkins进行持续集 ...
- 算法---BitMap
问题: 假设有3亿个整数(范围0-2亿),如何判断某一个树是否存在.局限条件一台机器,内存500m. 常规的思路:我们可以将数据存到一个集合中,然后判断某个数是否存在:或者用一个等长的数组来表示,每个 ...
- Unix的I/O模型
对于一次I/O操作(以read为例),数据首先被拷贝到内核的某个缓冲区,然后再从内核缓冲区拷贝到应用进程缓冲区. 因此,一次I/O操作通常包含两个阶段: (1) 等待数据准备好 (2) 从内核向进程复 ...
- 【MIT6.828】centos7下使用Qemu搭建xv6运行环境
title:[MIT6.828]centos7下使用Qemu搭建xv6运行环境 date: "2020-05-05" [MIT6.828]centos7下搭建xv6运行环境 1. ...
- Tomcat Ghostcat - AJP协议漏洞DEBUG
环境 IntelliJ IDEA 2020.1 x64 tomcat-8.5.46 配置 pom.xml <?xml version="1.0" encoding=" ...