【】

【分析】小猪真的是一个很好的问题。我认为这是一个问题洪水。建立拓扑后(便!

)。直接把最外层设定序号为1,第二层为2。bfs下去就可以。

结果发现:飞行序号不能同样。。

于是開始想。

先考虑第一个问题:打印一个合法序列。我開始是这么想的:

观察每一个飞机的最晚飞行序号Ki,由于必然有解,所以我们能够让它的序号就是Ki。然后用它的时间去更新前面的时间(图能够反向建立)。应该能够维护一个大根堆,每次挑出最大的一个进行处理。

【简易代码】

  1. memset(T,0x7f,sizeof(T));
  2. for (i=1;i<=n;i++)
  3. if (!num[i]) T[i]=k[i],q.push(make_pair(k[i],i));
  4. while (!q.empty())
  5. {
  6. temp=q.top();q.pop();
  7. P=temp.second;
  8. for (i=end[P];i;i=a[i].next)
  9. {
  10. go=a[i].go;
  11. if (T[P]-1<T[go]) T[go]=T[P]-1,q.push(make_pair(T[go],go));
  12. }
  13. }
  14. sort(id+1,id+n+1,cmp);
  15. for (i=1;i<=n;i++)
  16. if (i<n) printf("%d ",id[i]);else printf("%d\n",id[i]);

考虑第二个问题:求出每一个飞机最早的起飞序列。好像嘛,有点~~

我是这么想的:每次枚举一架飞机i,先找到全部在它之前的飞机(下面的dfs进行了一遍flood—fill)

显然这些是一定在前面的。

然后我再去找剩余的飞机——统计最晚时间ki的个数。

然后枚举可行的时间点j并推断是否可行(二分也能够,只是反正已经O(N)了)。

【简易代码】

  1. for (now=1;now<=n;now++)
  2. {
  3. memset(T,0,sizeof(T));
  4. memset(deep,0,sizeof(deep));
  5. dfs(now);
  6. ans=sum=0;
  7. for (i=1;i<=n;i++)
  8. if (T[i]&&i!=now) ans++;else if (i!=now) deep[k[i]]++;
  9. //for (i=1;i<=k[now];i++) sum+=deep[i];
  10. for (i=1;i<=k[now];i++)
  11. {
  12. if (ans+sum<i) break;
  13. sum+=deep[i];
  14. }
  15. printf("%d ",i);
  16. }

【思考】啦啦啦~~~可惜,以上的想法都是错的。。

。。

第二个有点想通了。由于ki的限制,有些飞机的最晚时间可能的确大于j。可是他们必须立马起飞。否则就没有时间了。我跑出来的解和标准数据相差的不是非常大,能够当骗分用。

【正解】膜拜了VLK的题解——能够把全部的边反向,ki与N取反。这样,最晚时间变成了最早时间,也就是说,枚举到每一个点的时候。都能够尽可能的拖晚时间。

【AC代码】

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. #define N 2005
  6. using namespace std;
  7. struct arr{int go,next;}a[20005];
  8. int end[N],ord[N],T[N],k[N],dis[N],num[N],id[N],Q[N];
  9. int P,n,m,i,x,y,now,cnt,go,ans,sum;
  10. pair<int,int>temp;
  11. inline void add(int u,int v)
  12. {
  13. a[++cnt].go=v;a[cnt].next=end[u];end[u]=cnt;
  14. }
  15. inline int work(int x)
  16. {
  17. memcpy(dis,num,sizeof(num));
  18. int h=0,t=0,v,p,i;
  19. for (i=p=1;i<=n;i++)
  20. {
  21. for (;p<=n&&k[v=ord[p]]<i;p++)
  22. if (!dis[v]&&v!=x) Q[++t]=v;
  23. if (h<t)
  24. {
  25. v=Q[++h];
  26. for (int j=end[v];j;j=a[j].next)
  27. {
  28. int go=a[j].go;dis[go]--;
  29. if (!dis[go]&&go!=x&&k[go]<i) Q[++t]=go;
  30. }
  31. }
  32. else return t;
  33. }
  34. return t;
  35. }
  36. inline bool cmp(int a,int b)
  37. {
  38. return T[a]<T[b];
  39. }
  40. inline bool cmp2(int a,int b)
  41. {
  42. return k[a]<k[b];
  43. }
  44. int main()
  45. {
  46. scanf("%d%d",&n,&m);
  47. for (i=1;i<=n;i++)
  48. scanf("%d",&k[i]),k[i]=n-k[i],ord[i]=i;
  49. for (i=1;i<=m;i++)
  50. {
  51. scanf("%d%d",&x,&y);
  52. add(y,x);num[x]++;
  53. }
  54. sort(ord+1,ord+n+1,cmp2);
  55. for (i=work(0);i;i--)
  56. {
  57. printf("%d",Q[i]);
  58. if (i>1) printf(" ");else printf("\n");
  59. }
  60. for (i=1;i<=n;i++)
  61. printf("%d ",n-work(i));
  62. return 0;
  63. }

【总结】一道NOI的好的标题。有时间值我们必须再次回顾!

版权声明:本文博客原创文章,博客,未经同意,不得转载。

bzoj 2109 &amp; 2535 空中管制 解读的更多相关文章

  1. bzoj 2535 && bzoj 2109 [Noi2010]Plane 航空管制——贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2535 https://www.lydsy.com/JudgeOnline/problem.p ...

  2. bzoj 2109: [Noi2010]Plane 航空管制

    Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频 发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此, 小X表示很不满意. 在这次来烟台的 ...

  3. bzoj 2535 & bzoj 2109 航空管制 —— 贪心+拓扑序

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2535 https://www.lydsy.com/JudgeOnline/problem.p ...

  4. BZOJ.2109.[NOI2010]航空管制(拓扑 贪心)

    题目链接 双倍经验(没有第一问) \(Description\) \(Solution\) 第一问拓扑排序即可. 第二问,即让一个元素在拓扑序中尽量靠前,好像不好做. 但是可以让一个元素出现尽量靠后. ...

  5. BZOJ 2109 航空管制(拓扑排序+贪心)

    绝世好题啊.. 题意:给出一个DAG,和每个点要求出现在这个DAG里面的拓扑排序的位置<=ti,求出所有可能的拓扑排序里面每个点出现的位置的最小值. 正着做不好做,考虑反着做,建立这个图的反图. ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. [BZOJ2109][NOI2010]航空管制(贪心+拓扑)

    2109: [Noi2010]Plane 航空管制 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1227  Solved: 510[Submit][ ...

  8. 【RL-TCPnet网络教程】第29章 NTP网络时间协议基础知识

    第29章      NTP网络时间协议基础知识 本章节为大家讲解NTP (Network Time Protocol,网络时间协议)和SNTP(简单网络时间协议,Simple Network Time ...

  9. 2109&2535: [Noi2010]Plane 航空管制 - BZOJ

    Description世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上, ...

随机推荐

  1. Java容器的概要

    [Java流输入/输出原理] 在Jaav程序.对于输入数据/输出操作"流"(stream)时尚:J2SDK它提供了多种 各种各样的"流"类,用于获得不同类型的数 ...

  2. Vs2012在Linux应用程序开发(3):加入新平台hi3516

    下面我们将VS2012添加一个新的平台支持,由于近来与哈斯hi3516.就选它吧! 1.1     复制平台文件 原来一直认为要让VS支持一个新的平台须要编写代码,某天在看MSBUILD文件夹的时候突 ...

  3. 递归遍历XML所有节点

    package xml; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.DocumentEx ...

  4. Python3.4 邮件(包含附件与中国)

    import smtplib import os from email.mime.text import MIMEText from email.mime.multipart import MIMEM ...

  5. Net 高效开发

    Net 高效开发之不可错过的实用工具   工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内存 ...

  6. Sandcastle生成帮助文档

    http://www.cnblogs.com/net515/p/3311584.html Sandcastle帮助文档生成器使用介绍 一.软件介绍       Sandcastle是一个管理类库的文档 ...

  7. 修改系统启动项 grub2配置的方法 ubuntu[转]

    在 早期的Ubuntu中,使用Grub作为系统的启动引导程序,想修改系统启动项非常简单,只要用gedit打开系统菜单设定文件( sudo gedit /boot/grub/menu.lst ),修改该 ...

  8. [Windwos Phone] 实作地图缩放 MapAnimationKind 属性效果

    原文:[Windwos Phone] 实作地图缩放 MapAnimationKind 属性效果 [前言] 使用经纬度来定位地图的位置,以及使用 MapAnimationKind 属性来设定地图缩放时的 ...

  9. VMware vSphere 服务器虚拟化之十六 桌面虚拟化之VMware Horizon View

       VMware vSphere服务器虚拟化之十六 桌面虚拟化之VMware Horizon View  VMware Horizon View (原VMware View的升级版现在版本5.2)是 ...

  10. JDK源码学习系列01----String

                                                     JDK源码学习系列01----String 写在最前面: 这是我JDK源码学习系列的第一篇博文,我知道 ...