题目:


思路:
看到这种找前后的题目... 第一反应就是拓扑排序_(:з」∠)_
每条线段都有左右两个端点咯, 然后就乱搞吧..
我们用\(i\)和\(i'\)分别表示第\(i\)条线段的左右端点..
然后如果\(x\)在\(y\)的左边, 那么\(x'\)一定小于\(y\), 我们就建一条\(x'->y\)的边
如果\(x\)与\(y\)相交, 那么一定\(x<y'\)且\(y<x'\)(显然), 我们就分别建\(x->y'\)和\(y->x'\)两条边.
然后对于每个点\(x\), \(x<x'\), 那么再建\(x->x'\)的边...
然后为了字典序, 把编号扔进一个小根堆里维护一下, 按照堆的顺序跑一边拓扑排序大约就可以了吧..
Wrong的情况也很好特判, 只要判断进队的点的个数不到\(2n\)就好了...
轻松加愉快地过了样例. 于是这样就做完了?


然后非常无耻地找了一下数据一测, 发现得到了10pts... 就是输出Wrong的10分...
然后发现顺序全错了...这就很尴尬...
那就打开组数据看一下嘛, 反正\(n\leq10\)的数据很适合手玩..
然后第二组数据(\(n\)最小的一组)是这样的:

7 4
2 1 7
2 2 7
1 7 5
2 4 2

我们来画一下:
就可以看出问题了. 如果我们这么做, 在\(x\)进堆之前, 若\(\exists\)边\(y->x\)且\(\exists u满足x<u<y\), 则拓扑序列将变为\(u y x\)而不是\(y x u\), 字典序就不优了..(看清楚题目的字典序指的是什么..)
那怎么办啊? 为了解决这个问题, 我们考虑把边都反向, 堆变成一个大根堆, 然后顺序从后向前做(就是最后把拓扑序列倒过来), 就可以了..
因为我们发现, 这么一搞, 存在依赖的编号较小的点将会比较靠后的弹出, 倒过来就变成优先了, 也就满足了字典序的要求..
然后想到这一点就没什么难度了...
std好像用了手写堆, 但是我人懒就直接上priority_queue咯, 不过跑的还是飞快, 最大的点也用不到0.3s..
代码:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=202020;
priority_queue<int> q;
inline int gn(int a=0,char c=0){for(;c<'0'||c>'9';c=getchar());for(;c>47&&c<58;c=getchar())a=a*10+c-'0';
return a;}
struct edge{int to,next;}e[N];
int v[N],du[N],ans[N],tot,cnt,n,m;
inline void buildedge(int x,int y){++du[y]; e[++tot].to=y; e[tot].next=v[x]; v[x]=tot;
}
int main(){freopen("seg.in","r",stdin); freopen("seg.out","w",stdout);n=gn(),m=gn();for(int i=1;i<=n;++i) buildedge(i*2,i*2-1);for(int i=1;i<=m;++i){int x=gn(),y=gn(),z=gn();if(x==1) buildedge(z*2,y*2-1),buildedge(y*2,z*2-1);else buildedge(z*2-1,y*2);}n<<=1;for(int i=1;i<=n;++i)if(!du[i]) q.push(i); cnt=n;while(!q.empty()){int x=q.top(); q.pop();for(int j=v[x];j;j=e[j].next){--du[e[j].to];if(du[e[j].to]==0)q.push(e[j].to);}ans[x]=cnt--;}if(cnt) puts("Wrong");else for(int i=1;i<=n;i+=2)printf("%d %d\n",ans[i],ans[i+1]);
}

转载于:https://www.cnblogs.com/enzymii/p/8483576.html

【学术篇】2.28测试T2 线段 拓扑排序相关推荐

  1. 拓扑排序(topological sorting)介绍及Python实现

    目录 1. 拓扑排序 2. 拓扑排序存在的前提 3. 拓扑排序的唯一性问题 4. 拓扑排序算法原理 4.1 广度优先遍历 4.2 深度优先遍历 5. 代码实现 5.1 Graph类的实现 5.2 广度 ...

  2. [多校联考-西南大学附中]切面包(线段树/概率与期望)+ Slow Path Finding Algorithm(拓扑排序/DP)+ 分数转化(数论)

    文章目录 T1:分数转换 题目 题解 代码实现 T2:Slow Path Finding Algorithm 题目 题解 代码实现 T3:切面包 题目 题解 代码实现 T1:分数转换 题目 Time ...

  3. 2018人工智能期末考试复习资料(一):学术篇

    机器之心知识委员会 机心通知函[2018]002号 2018 年人工智能专业期末考试复习资料:学术篇 各人工智能研究者.工程师.从业人: 2018 年是人工智能迅猛发展的一年,从技术研究到产业应用都取 ...

  4. OpenCASCADE绘制测试线束:拓扑命令之纹理映射到形状

    OpenCASCADE绘制测试线束:拓扑命令之纹理映射到形状 纹理映射到形状 vtexture vtexscale vtexorigin vtexrepeat vtexdefault 纹理映射到形状 ...

  5. OpenCASCADE绘制测试线束:拓扑命令之历史命令

    OpenCASCADE绘制测试线束:拓扑命令之历史命令 历史命令 setfillhistory savehistory isdeleted modified generated 为算法启用绘图历史支持 ...

  6. OpenCASCADE绘制测试线束:拓扑命令之复杂拓扑

    OpenCASCADE绘制测试线束:拓扑命令之复杂拓扑 复杂拓扑 offsetshape, offsetcompshape featprism, featdprism, featrevol, feat ...

  7. OpenCASCADE绘制测试线束:拓扑命令之拓扑和曲面创建

    OpenCASCADE绘制测试线束:拓扑命令之拓扑和曲面创建 曲面创建 gplate filling, fillingparam 曲面创建 曲面创建命令包括从边界和形状之间的空间创建的曲面. gpla ...

  8. OpenCASCADE绘制测试线束:拓扑命令之拓扑和几何分析

    OpenCASCADE:绘制测试线束:拓扑命令之拓扑和几何分析 拓扑和几何分析 lprops.sprops.vprops bounding isbbinterf distmini xdistef.xd ...

  9. OpenCASCADE绘制测试线束:拓扑命令之Making the touching shapes connected

    OpenCASCADE绘制测试线束:拓扑命令之Making the touching shapes connected Making the touching shapes connected mak ...

最新文章

  1. DrawIcon 和 DrawIconEx都失真
  2. 手把手教你安装Flutter(Flutter起步之安装)
  3. Apache Flink Meetup,1.13 新版本发布 x 互娱场景实践分享的开发者盛筵!
  4. Attachment assignment block里选择的文件是如何传到Netweaver服务器的
  5. linux部署node web,nodejs怎么部署到Linux上?
  6. Github | PyTorch实现的深度强化学习算法集
  7. 加密芯片——AES算法特点与应用注意事项
  8. 端口占用问题解决办法(以1099端口为例)
  9. keydown和keypress的区别
  10. 使用wav2sbc.exe无法转换WAV文件问题
  11. android模拟鼠标键盘,有关通过Happy Android模拟器的鼠标和键盘操作进行手机游戏的详细设置的图形教程...
  12. 华为安装gsm框架_gms安装器华为下载-GMS安装器 安卓版v3.0-PC6安卓网
  13. 觅风易语言教程全集(完整超清版+源码)
  14. 人脸识别 -- 活体检测(张嘴摇头识别)
  15. 第三章 概念模型设计(一)
  16. 佰落暑期java自学记录-9
  17. SNKr:创造新的潮圈文化 将区块链与时尚潮流结合
  18. android的SDK、ADT下载地址
  19. python中的corr()方法
  20. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

热门文章

  1. r生成html文件,从R中的许多html文件创建一个语料库
  2. linux系统下c语言程序需要改动的地方,如何在Linux系统环境下进行C语言开发
  3. HTTP Headers Content-Disposition
  4. C语言 FileStreaming fseek
  5. Python DES
  6. ubuntu shuangxitong
  7. TensorFlow VGG16
  8. vga/dvi/hdmi/dp
  9. hadoop jar
  10. docker image