BZOJ 2535:NOI 2010 航空管制
[NOI2010]航空管制
题面请点上面。
首先第一问,我第一想法是把它放到一个小根堆中,然而这是不行的。
正确的思路是,把图反过来建,然后放到一个大根堆里去。
至于原因,感性理解一下,正着贪是有后效性,会陷入到局部最优解,而反着贪则是从终点出发,是正确的。
第二问也不难,我们考虑当前这个点,能不动他就不动,直到不动不行了(此时两种情况,一是堆空了,二是有人起飞时间晚于降落时间),此时就是第二问的答案。
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include<string> #include<cmath> #include<queue> #define SIZE 1000005 #define rint register int using namespace std; inline int read() {int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';return x*f; } inline void write(int x) {if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');return ; }struct node {int id,v;bool operator < (const node &x) const{return x.v>v;} }; int n,m,cnt,in[SIZE],ru[SIZE],ans[SIZE],v[SIZE]; int head[SIZE],nex[SIZE],to[SIZE],total; priority_queue<node> q;inline void link(int x,int y) {to[++total]=y;nex[total]=head[x];head[x]=total;return ; }inline void solve1() {for(rint i=1;i<=n;++i) in[i]=ru[i];for(rint i=1;i<=n;++i)if(!in[i])q.push((node){i,v[i]});while(q.size()){int x=q.top().id;q.pop();ans[++cnt]=x;for(rint i=head[x];i;i=nex[i]){int y=to[i];--in[y];if(!in[y]) q.push((node){y,v[y]});}} }inline int solve2(int k) {while(q.size()) q.pop();for(rint i=1;i<=n;++i) in[i]=ru[i];for(rint i=1;i<=n;++i) if(!in[i] && i!=k)q.push((node){i,v[i]});for(rint c=n;c>=1;--c){if(!q.size() || q.top().v<c) return c;int x=q.top().id;q.pop();for(rint i=head[x];i;i=nex[i]){int y=to[i];--in[y];if(!in[y] && y!=k) q.push((node){y,v[y]});}} }int main() {n=read(),m=read();for(rint i=1;i<=n;++i) v[i]=read();for(rint i=1;i<=m;++i){int x=read(),y=read();link(y,x);++ru[x];}solve1(); for(rint i=cnt;i>=1;--i) write(ans[i]),cout<<" ";puts("");for(rint i=1;i<=n;++i) write(solve2(i)),cout<<" "; return 0; }
View Code
转载于:https://www.cnblogs.com/mxrmxr/p/10349395.html
BZOJ 2535:NOI 2010 航空管制相关推荐
- bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...
- bzoj 2109: [Noi2010]Plane 航空管制
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频 发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此, 小X表示很不满意. 在这次来烟台的 ...
- [NOI2010]航空管制(拓扑排序+贪心)
题目描述 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上,小X不幸又一 ...
- NOI 2010 能量采集
题目描述 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得非常整齐,一共 ...
- BZOJ2535: [Noi2010]Plane 航空管制2
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2535 把图反向,拓扑排序一下,用并查集维护当前权值能放置的最大位置.对于第二问,就相当于我把点 ...
- BZOJ 4197 NOI 2015 寿司晚宴
题面 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 ...
- [bzoj 4199][NOI 2015]品酒大会
传送门 Description 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎 ...
- BZOJ 2436 NOI嘉年华(单调优化)
http://www.lydsy.com/JudgeOnline/problem.php?id=2436 题意:两个会场不能同时表演,但是同一个时间可以同时表演,要求让两个会场表演数量最小的最大,然后 ...
- BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】
题目链接 BZOJ2535 题解 航班之间的关系形成了一个拓扑图 而且航班若要合法,应尽量早出发 所以我们逆拓扑序选点,能在后面出发的尽量后面出发,不会使其它点变得更劣,容易知是正确的 第二问只需枚举 ...
最新文章
- vue 带全选和多选的表格怎么写_vue实现下拉列表多选全选以及模糊查询的vue组件...
- on 和where条件的放置详解
- TF:利用TF读取数据操作,将CIFAR-10 数据集中的训练图片读取出来,并保存为.jpg格式
- python自动化接口测试excel用例串行之行_python 读取 Excel 自动化执行测试用例
- 小评几种O/R Mapping工具
- 电商无线端秋季促销PSD分层海报,大战之前设计师准备好了么?
- 测试oracle的存储过程,测试技能:在oracle中自用存储过程进行测试数据构造
- window.showModalDialog用法
- python turtle代码示例-Python turtle.left方法代码示例
- android NDK如何解决Please define the NDK_PROJECT_PATH variable to point to it
- centos编译安装vim7.4
- iOS遇到问题小总结
- 好玩好用软件推荐,让你大开眼界
- ros系列—解决文件改名导致节点无法启动问题及ros::NodeHandle nh与nh(“~“)的理解
- Python爬虫爬取B站封面图片,这才是我们学好爬虫的动力!
- 安卓手机怎么运行java?如何在Android手机上运行jAVA程序?
- java 两张图片叠加合并
- c语言中地址值是什么意思,单片机C语言中如何区别是地址还是数值啊?
- A - DZY Loves Sequences
- 光伏开启全面洗牌模式 逆变器进入寡头时代