bzoj 2535 && bzoj 2109 [Noi2010]Plane 航空管制——贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2535
https://www.lydsy.com/JudgeOnline/problem.php?id=2109
考虑按拓扑序决策,发现不太行;主要是一种情况:虽然自己的 k[ ] 靠后,但自己限制的点的 k[ ] 靠前。
这样的话,自己应该尽量往前放;但为了别的点的这种情况,自己又应该尽量往后放,所以无法决策了。
发现这种情况主要和后面的点是否紧急有关。所以就是虽然拓扑序是那样的,但可以先决策的点应该是拓扑序靠后的点。
所以反着拓扑,然后按顺序决策。那么一个点就是在符合自己 k[ ] 的基础上尽量往后放就行了。
这里能放的位置应该是自己 k[ ] 之前的第一个没被占用的位置,可以用并查集而不是 set (只是会变慢罢了)维护。
考虑第二问,则尽量先把其他点往后放,非放自己不可的时候再放自己,那么自己就被放在自己能放的最前面了。
方法就是先决策其他点,遇到自己可以决策也不决策。最后非放自己不可的时候其他没放的点一定都是被自己限制的点,则自己只能放在当前空位的最后一个。
注意找自己的 k[ ] 之前的第一个没被占用的位置的时候应该考虑一下自己应该放在限制自己的那些点的前面!
比如一个点限制要放在另一个点前面,但它的 k[ ] 却比那个点大;直接按刚才说的找位置的话自己可能放在限制自己点的后面了。
要解决这种情况,只要拓扑的时候 k[ v ] 对 k[ cr ] 取 min 就行了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
const int N=,M=;
int n,m,hd[N],xnt,to[M],nxt[M],fa[N],sta[N],top;
int deg[N],ydeg[N],r[N],ans[N];
queue<int> q;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mn(int a,int b){return a<b?a:b;}
void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;deg[y]++;}
int fnd(int a){return fa[a]==a?a:fa[a]=fnd(fa[a]);}
void solve(int cr)
{
memcpy(deg,ydeg,sizeof ydeg);
for(int i=;i<=n;i++)fa[i]=i;
top=;
for(int i=;i<=n;i++)if(!deg[i]&&i!=cr)sta[++top]=i;
while(top)
{
int k=sta[top--],d=fnd(r[k]);
fa[d]=fnd(d-);
for(int i=hd[k],v;i;i=nxt[i])
if(!(--deg[v=to[i]])&&v!=cr)sta[++top]=v;
}
printf("%d ",fnd(n));
}
int main()
{
n=rdn();m=rdn();
for(int i=;i<=n;i++)r[i]=rdn();
for(int i=,u,v;i<=m;i++)
{
u=rdn();v=rdn();add(v,u);
}
memcpy(ydeg,deg,sizeof deg);
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=n;i++)if(!deg[i])sta[++top]=i;
int deb=;
while(top)
{
int k=sta[top--],d=fnd(r[k]);
ans[d]=k;fa[d]=fnd(d-);
for(int i=hd[k],v;i;i=nxt[i])
{
r[v=to[i]]=Mn(r[v],r[k]);//
if(!(--deg[v]))sta[++top]=v;
}
}
for(int i=;i<=n;i++)printf("%d ",ans[i]);puts("");
for(int i=;i<=n;i++)solve(i);puts("");
return ;
}
bzoj 2535 && bzoj 2109 [Noi2010]Plane 航空管制——贪心的更多相关文章
- bzoj 2109: [Noi2010]Plane 航空管制
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频 发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此, 小X表示很不满意. 在这次来烟台的 ...
- 【BZOJ2109/2535】【NOI2010】航空管制(贪心)
[BZOJ2109/2535][NOI2010]航空管制(贪心) 题面 BZOJ2109 BZOJ2535 题解 很好玩的一道题目 先看第一问,显然是要找一个合法的拓扑排序的序列. 直接拓扑排序,把队 ...
- 2109&2535: [Noi2010]Plane 航空管制 - BZOJ
Description世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上, ...
- BZOJ 2535: [Noi2010]Plane 航空管制2
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...
- BZOJ2109: [Noi2010]Plane 航空管制
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频 发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此, 小X表示很不满意. 在这次来烟台的 ...
- BZOJ2535 [Noi2010]Plane 航空管制2
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...
- bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...
- BZOJ2535: [Noi2010]Plane 航空管制2(拓扑排序 贪心)
题意 题目链接 Sol 非常妙的一道题. 首先不难想到拓扑排序,但是直接对原图按\(k\)从小到大拓扑排序是错的.因为当前的\(k\)大并不意味着后面的点\(k\)也大 但是在反图上按\(k\)从大到 ...
- BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】
题目链接 BZOJ2535 题解 航班之间的关系形成了一个拓扑图 而且航班若要合法,应尽量早出发 所以我们逆拓扑序选点,能在后面出发的尽量后面出发,不会使其它点变得更劣,容易知是正确的 第二问只需枚举 ...
随机推荐
- 聊一聊Spring AOP
前两天,在给新入职的同事做技术介绍时,讲到spring的AOP.使我又一次认识到,对于AOP,特别是spring AOP的理解,虽然大家都能说上来几句,但是许多人认识并不太全面,甚至可以说是一知半解- ...
- IOS UI-控制器的创建和控制器的View的创建
一.控制器的创建和控制器的View的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在 ...
- 08day03
一.eclipse的使用 可能是全宇宙最好用的IDE debug 查看执行过程 查看源码 二.模块的常用方法 __name__ __file__ __doc__ 三.函数 参数 参数默认值 可变参数 ...
- iptables详解(6):iptables扩展匹配条件之’–tcp-flags’
如果你看过前文,那么你一定知道,前文已经对"tcp扩展模块"做过总结,但是只总结了tcp扩展模块中的"--sport"与"--dport"选 ...
- window.history.go(-1);
history是你浏览过的网页的url(简单的说就是网址)的集合,也就是你的浏览器里的那个历史记录.它在js里是一个内置对象,就跟document一样,它有自己的方法,go就是其中一个. 这个方法的参 ...
- poj2771
题解: 二分图最大独立及 每两个不能选的渐变 输出n+m-最大匹配 代码: #include<cstdio> #include<cmath> #include<algor ...
- CF445
题解: xjb乱判断一下就可以了 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; int n, ...
- Linux服务器通过拷贝的方式安装多个tomcat
Tomcat占用资源少.运行速度快.安装配置简单,在个人开发中拥有广泛的使用者.很多人在使用中存在以下的误区:1.Tomcat必须通过eclipse启动2.Tomcat必须通过安装才能使用运行3.一台 ...
- 老鼠走迷宫(2)输出所有路径(C语言)
需求 有一个迷宫,在迷宫的某个出口放着一块奶酪.将一只老鼠由某个入口处放进去,它必须穿过迷宫,找到奶酪.请找出它的行走路径. STEP 1 题目转化 我们用一个二维数组来表示迷宫,用2表示迷宫的墙壁, ...
- 转:JAVA CAS原理深度分析
看了一堆文章,终于把Java CAS的原理深入分析清楚了. 感谢GOOGLE强大的搜索,借此挖苦下百度,依靠百度什么都学习不到! 参考文档: http://www.blogjava.net/xylz/ ...