题目:





思路:

看到这种找前后的题目... 第一反应就是拓扑排序_(:з」∠)_

每条线段都有左右两个端点咯, 然后就乱搞吧..

我们用\(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]);
}

【学术篇】2.28测试T2 线段 拓扑排序的更多相关文章

  1. Day1:T1 模拟 T2 拓扑排序

    T1:模拟 自己第一天的简直跟白痴一样啊...模拟都会打错.. 当时貌似在更新最大值的时候打逗比了... if((sum[x]==max && x<maxh) || sum[x] ...

  2. P3387缩点(tarjan+拓扑排序+线性dp)

    题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...

  3. [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]

    题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...

  4. BZOJ4383 [POI2015]Pustynia[线段树优化建边+拓扑排序+差分约束]

    收获挺大的一道题. 这里的限制大小可以做差分约束,从$y\to x$连$1$,表示$y\le x-1$即$y<x$,然后跑最长路求解. 但是,如果这样每次$k+1$个小区间每个点都向$k$个断点 ...

  5. 【拓扑排序】【线段树】Gym - 101102K - Topological Sort

    Consider a directed graph G of N nodes and all edges (u→v) such that u < v. It is clear that this ...

  6. python自动化测试应用-第6篇(WEB测试)--Selenium元素篇

    篇6                            python自动化测试应用-Selenium基础篇 --lamecho 1.1概要 大家好!我是lamecho(辣么丑),上一篇我们搭建好p ...

  7. CF798E. Mike and code of a permutation [拓扑排序 线段树]

    CF798E. Mike and code of a permutation 题意: 排列p,编码了一个序列a.对于每个i,找到第一个\(p_j > p_i\)并且未被标记的j,标记这个j并\( ...

  8. BZOJ4383 Pustynia(线段树+拓扑排序)

    线段树优化建图暴力拓扑排序即可.对于已确定的数,拓扑排序时dp,每个节点都尽量取最大值,如果仍与已确定值矛盾则无解.叶子连出的边表示大于号,其余边表示大于等于. #include<iostrea ...

  9. 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)

    题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...

随机推荐

  1. CSUST 集训队选拔赛题解

    选拔赛的题解,~~~ 题目链接:请点击 A题 素数筛 + 线段树(树状数组) 先用素数筛打表,然后线段树更新,遍历求出值,O(1)查询即可 AC代码: /*num数组 是把记录 数是否存在 存在即为1 ...

  2. JS中Ajax的实现部分

    2015-9-1 var url = "<%=servletName%>?user="+username.value+"&pwd="+pas ...

  3. Java中this的基础用法

    update on 2019-07-07 在Java核心技术一书中看到调用方法时this作为隐式参数传入的. 突然间许多问题都懂了 比如:方法的多态 父类变量指向子类对象的引用 对象变量指向的实际类型 ...

  4. rabbitmq AmqpClient 使用Topic 交换机投递与接收消息,C++代码示例

    // strUri = "amqp://guest:guest@192.168.30.11:8820/test" // strUri = "amqp://[帐户名]:[密 ...

  5. 微信小程序分享功能的path路径

    表示被微信小程序坑惨了 糟心的开始写,老板说先不上太复杂,就先显示了两个页面,然后开开心心的发布,测试了几遍,没啥问题呀.结果,一上上去,就被老板批了! 啥呀! 这分享怎么这个鬼样子!明明我看文档都是 ...

  6. centos 7.6安装python3环境

    Centos7安装Python3的方法   由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到. [root@VM_105_217_ ...

  7. Java中的Set集合以及HashSet

    Set集合: Set继承自Collection,所以没有什么特别的方法. 需要注意的是,Set集合不包含重复元素,我们重点了解Set集合如何保证不包含多余元素. HashSet: HashSet如何保 ...

  8. 【leetcode】969. Pancake Sorting

    题目如下: Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.len ...

  9. thinkcmf链接多个数据库

    1.打开/data/conf/config.php 'db1'=>[ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '', / ...

  10. JPA中遇到一些异常的分析与解决

    Spring Data JPA踩坑到填坑:1 JPA多对多关 //作者表 //书籍表 Book和Author是多对多关系 先放两张图做个说明:Jpa底层依赖于hibernate,hibernate默认 ...