题目链接

戳我

\(Description\)

有若干限制,需要求一个\(1\)到\(n\)的排列,每个限制\((x,y)\)表示\(x\)必须在\(j\)之前,并要求所求的排列满足所有限制并让\(1\)的位置尽量靠前,在此基础上让\(2\)的位置尽量靠前,以此类推.

\(n<=100000\)

\(Solution\)

这题直接拓扑排序选字典序最小的显然不行,因为题目要求不是问字典序最要,而是要:

满足所有限制并让\(1\)的位置尽量靠前,在此基础上让\(2\)的位置尽量靠前,以此类推

那么我们显然需要想一想别的办法了.

那么想一想,怎么样满足条件呢?

如果把越大的数放在后面,那么前面的小数都能够尽量靠前。

这样便符合条件了

至于做法:

建反向图用堆跑拓扑排序,每次取出入度为\(0\)且最大的点.

最后反序输出就好了.

\(Code\)

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. typedef long long ll;
  5. int read() {
  6. int x=0,f=1;
  7. char c=getchar();
  8. while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
  9. while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
  10. return x*f;
  11. }
  12. priority_queue<int> q;
  13. struct node {
  14. int to,next;
  15. }a[100010<<1];
  16. int head[100010],cnt,vis[100010],ans[100010];
  17. void add(int x,int y){
  18. a[++cnt].to=y;
  19. a[cnt].next=head[x];
  20. head[x]=cnt;
  21. }
  22. void solve(){
  23. memset(vis,0,sizeof(vis)),memset(head,0,sizeof(head)),cnt=0;
  24. int n=read(),m=read(),x,y,v,tot=0;
  25. for(int i=1;i<=m;i++)
  26. x=read(),y=read(),add(y,x),vis[x]++;
  27. for(int i=1;i<=n;i++)
  28. if(!vis[i])
  29. q.push(i);
  30. while(!q.empty()){
  31. int now=q.top();
  32. q.pop();
  33. for(int i=head[now];i;i=a[i].next){
  34. v=a[i].to,vis[v]--;
  35. if(!vis[v])
  36. q.push(v);
  37. }
  38. ans[++tot]=now;
  39. }
  40. if(tot!=n)
  41. puts("Impossible!");
  42. else{
  43. for(int i=n;i>=1;i--)
  44. printf("%d ",ans[i]);
  45. printf("\n");
  46. }
  47. }
  48. main(){
  49. int T=read();
  50. while(T--)
  51. solve();
  52. }

「HNOI 2015」菜肴制作的更多相关文章

  1. 「HNOI 2015」实验比较

    \(Description\) 有\(n\)个元素,对于每个元素\(x_i\)最多知道一个形如\(x_j < x_i\)或\(x_j=x_i\)的条件,问有多少合法的序列.合法的序列满足每个元素 ...

  2. 「HNOI 2015」亚瑟王

    \(Description\) 有\(n\)张卡牌,每一张卡牌有\(p_i\)的概率发动,并造成\(d_i\)点伤害.一共有\(r\)轮,每一轮按照编号从小到大依次考虑,如果这张牌已经发动过则跳过该牌 ...

  3. 「HNOI 2015」落忆枫音

    题目链接 戳我 \(Description\) 给一张\(n\)割点\(m\)条边的\(DAG\),保证点\(1\)不存在入边,现在需要在\(DAG\)中加入一条不在原图中的边\((x,y)\),求这 ...

  4. 「HNOI2015」菜肴制作

    「HNOI2015」菜肴制作 这道题想到了其实还挺水的,一开始我直接用小根堆拓扑然后就爆0了,然后我又用十万个堆搜索,T30,还是xkl告诉我要倒着拓扑. 首先要建反图,对于入度为0的点,较小的点先输 ...

  5. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  6. 【LOJ】#2114. 「HNOI2015」菜肴制作

    题解 把所有边反向 从小到大枚举每个点,把每个点能到达的点挑出来,判完无解后显然是一个DAG,然后在上面求一个编号最大的拓扑序,把这些点全部标记为已选,把每次求得的拓扑序倒序输出 代码 #includ ...

  7. 「HNOI 2019」白兔之舞

    一道清真的数论题 LOJ #3058 Luogu P5293 题解 考虑$ n=1$的时候怎么做 设$ s$为转移的方案数 设答案多项式为$\sum\limits_{i=0}^L (sx)^i\bin ...

  8. 「HNOI 2016」 序列

    \(Description\) 给你一个序列,每次询问一个区间,求其所有子区间的最小值之和 \(Solution\) 这里要用莫队算法 首先令\(val\)数组为原序列 我们考虑怎么由一个区间\([l ...

  9. 「HNOI 2014」 江南乐

    \(Description\) \(n\)堆石子,每堆石子有\(s_i\)个,两个人轮流操作,每次可以将一对不少于\(F\)的石子尽量平均分成\(m\)堆,\(m\)每次自选,不能操作者输.共有\(T ...

随机推荐

  1. 什么时候必须使用UI相机? 多个相机的作用原理?

    首先,要从主画布说起,maincanvas,这个有什么限制?主画布是一张默认用来绘制UI的地方,这些UI必须是系统提供的UI组件,在画面下挂一个3D物体或非UI的2D物品是不会被绘制到画布上的,但是仍 ...

  2. mysql varchar类型转换int类型

    select * from gyzd_yysinfo order by cast(yysid as SIGNED INTEGER) 或者 select * from gyzd_yysinfo orde ...

  3. MyBatis 体系结构

  4. redis centos7

    官网下载tar包 make 修改conf 修改 启动脚本 utils/redis_init_script 开放端口6379

  5. Kafka源码分析

    本文主要针对于Kafka的源码进行分析,版本为kafka-0.8.2.1. 由于时间有限,可能更新比较慢... Kafka.scala // 读取配置文件 val props = Utils.load ...

  6. curl 访问 k8s

    curl https://mhc:6443/api --cacert ssl/ca.crt --key client_ssl/cs_client.key --cert client_ssl/cs_cl ...

  7. cdoj32-树上战争(Battle on the tree) 【记忆化搜索】

    http://acm.uestc.edu.cn/#/problem/show/32 树上战争(Battle on the tree) Time Limit: 12000/4000MS (Java/Ot ...

  8. Nginx源码完全注释(5)core/ngx_cpuinfo.c

    /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #include <ngx_config.h> #include ...

  9. WebPack 从安装到闲置

    序言:各种技术在研究过程中常常会出现在实际工作中难以实施的情况,于是就慢慢闲置,但学毕竟还是必须要学学的,就看能用到多少,至少开拓了眼界,谨以此安慰下那些学完又闲置的技术~ 跑题结束,以下开始正式配置 ...

  10. xgboost 里边的gain freq, cover

    assuming that you're using xgboost to fit boosted trees for binary classification. The importance ma ...