BZOJ 2535: [Noi2010]Plane 航空管制2
Description
Input
Output
由两行组成。
第一行包含 n个整数,表示一个可行的起飞序列,相邻两个整数用空格分隔。
输入数据保证至少存在一个可行的起飞序列。如果存在多个可行的方案,输出任
意一个即可。
第二行包含 n个整数 t1, t2, „, tn,其中 ti表示航班i可能的最小起飞序
号,相邻两个整数用空格分隔。
Sample Input
4 5 2 5 4
1 2
3 2
5 1
3 4
3 1
Sample Output
3 4 1 2 1
题解:
这个题目好难想,首先第一问还是比较套路的,我们对于n个点,连一个反图,拓扑排序一下,丢到一个按照点权排序的大根堆了面,正确性还是比较显然的,我们按照拓扑排序的顺序,那么一定满足了条件二的限制,那么用堆来搞,他们的点权就是他们的承受能力,那么承受能力强的排在后面,如果这样还不行,那么此题一定无解,(为什么正着做是错的我也不知道)。
然后第二问就比较难想了,我们枚举当前要计算答案的点,那么考虑拓扑排序的时候不把他丢到堆里面,直到出现不合法情况的时候,这个时候,就是他最早出现的位置,因为此刻如果还不放他进去,那么必然序列会不合法,所以这个时刻就是这个点的ans.
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#define MAXN 200050
#define RG register
using namespace std;
struct node{
int id,v;
bool operator < (const node&x)const{
return x.v>v;
}
}; struct edge{
int first;
int next;
int to;
int quan;
}a[MAXN*]; priority_queue<node> q;
int v[MAXN],in[MAXN],in2[MAXN],ans[MAXN];
int n,m,num=; void addedge(int from,int to){
a[++num].to=to;
a[num].next=a[from].first;
a[from].first=num;
} inline void work1(){
for(RG int i=;i<=n;i++) in2[i]=in[i];
for(RG int i=;i<=n;i++){
if(!in2[i]) q.push((node){i,v[i]});
}
while(!q.empty()){
int now=q.top().id;q.pop();
ans[++num]=now;
for(RG int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
in2[to]--;
if(!in2[to]) q.push((node){to,v[to]});
}
}
} inline int work2(int k){
while(!q.empty()) q.pop();
for(int i=;i<=n;i++) in2[i]=in[i];
for(int i=;i<=n;i++){
if(i!=k&&!in2[i]) q.push((node){i,v[i]});
}
for(RG int hh=n;hh>=;hh--){
if(q.empty()||q.top().v<hh) return hh;
int now=q.top().id;q.pop();
for(RG int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
in2[to]--;
if(!in2[to]&&to!=k) q.push((node){to,v[to]});
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&v[i]);
for(int i=;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
addedge(y,x);in[x]++;
}
num=;
work1();
for(int i=num;i>=;i--) printf("%d ",ans[i]);puts("");
for(int i=;i<=n;i++) printf("%d ",work2(i));
printf("\n");
return ;
}
BZOJ 2535: [Noi2010]Plane 航空管制2的更多相关文章
- bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...
- 2109&2535: [Noi2010]Plane 航空管制 - BZOJ
Description世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上, ...
- bzoj 2109: [Noi2010]Plane 航空管制
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频 发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此, 小X表示很不满意. 在这次来烟台的 ...
- bzoj 2535 && bzoj 2109 [Noi2010]Plane 航空管制——贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2535 https://www.lydsy.com/JudgeOnline/problem.p ...
- BZOJ2109: [Noi2010]Plane 航空管制
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频 发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此, 小X表示很不满意. 在这次来烟台的 ...
- BZOJ2535 [Noi2010]Plane 航空管制2
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...
- BZOJ2535: [Noi2010]Plane 航空管制2(拓扑排序 贪心)
题意 题目链接 Sol 非常妙的一道题. 首先不难想到拓扑排序,但是直接对原图按\(k\)从小到大拓扑排序是错的.因为当前的\(k\)大并不意味着后面的点\(k\)也大 但是在反图上按\(k\)从大到 ...
- BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】
题目链接 BZOJ2535 题解 航班之间的关系形成了一个拓扑图 而且航班若要合法,应尽量早出发 所以我们逆拓扑序选点,能在后面出发的尽量后面出发,不会使其它点变得更劣,容易知是正确的 第二问只需枚举 ...
- 【BZOJ2109/2535】【NOI2010】航空管制(贪心)
[BZOJ2109/2535][NOI2010]航空管制(贪心) 题面 BZOJ2109 BZOJ2535 题解 很好玩的一道题目 先看第一问,显然是要找一个合法的拓扑排序的序列. 直接拓扑排序,把队 ...
随机推荐
- android中的后退键——onBackPressed()的使用
转自:http://blog.sina.com.cn/s/blog_5085156c0101725e.html 很多网友不明白如何在Android平台上捕获Back键的事件,Back键是手机上的后退键 ...
- Servlet接口的实现
Servlet接口对Servlet进行了规范,定义了方法的主要范围. 1.public void init(ServletConfig servletConfig) (初始化) 参数的作用: (1)调 ...
- vs code: 将VS code添加至右键
解决问题:一般安装完vs code后,系统可能不会将其添加至右键等菜单上,不便于开发. 解决方案: 百度上有一些相关问题的解决办法,但是还是会遇到一些问题,以下面为例: 1.新建一个reg后缀的文件 ...
- Spring入门教程
Spring新手入门教程,配套下面这两个大神的课程就可以了. 一个是Spring视频教程. 一个是Spring博客教程. https://www.imooc.com/learn/196 http:// ...
- [LeetCode] 面试题之犄角旮旯 第叁章
题库:LeetCode题库 - 中等难度 习题:网友收集 - zhizhiyu 此处应为一个简单的核心总结,以及练习笔记. 查找一个数“在不在”?桶排序理论上貌似不错. 回文问题 ----> [ ...
- 【linux】【Go】Centos7安装go1.13环境
前言 Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言. 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pi ...
- elasticsearch的分布式基础概念(1)
Elasticsearch对复杂分布式机制的透明隐藏特性 Elasticsearch是一套分布式的系统,分布式是为了应对大数据量 隐藏了复杂的分布式机制 分片机制(随随便便就将一些document插入 ...
- 多源最短路径算法—Floyd算法
前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...
- 基于操作系统原理的Linux的内存管理
一.实验目的 1.理解虚拟内存.磁盘缓存的概念. 2.掌握基本的内存管理知识. 3.掌握查看实时查看内存.内存回收的方法 二.实验内容 1. 监控内存使用情况 2. 检查和回收内容 三.实验平台 1. ...
- 数据结构与算法(C/C++版)【排序】
第八章<排序> 一.直接插入排序 //直接插入排序 //算法思想:每趟将一个待排的关键字按照其值的大小插入到已经排好的部分有序序列的适当位置上,直到所有待排关键字都被插入到有序序列中为 ...