题目:





思路:

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

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

我们用\(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. 2018APIO 进京赶考

    先见识了一下CTSC的操作...涨了见识... 打铁匠x1 见识了个全英文的ppt,各种讲课其实真的讲的很好,只是逻辑性太强反而让完全不会的同学有些尴尬... linux真的令人窒息...GUIDE用 ...

  2. tail - 输出文件的末尾部分

    SYNOPSIS(总览) ../src/tail [OPTION]... [FILE]... DESCRIPTION(描述) 在标准输出上显示每个FILE的最后10行. 如果多于一个FILE,会一个接 ...

  3. laravel多字段模糊匹配

    use App\Models\Resume; $resume = Resume::query(); $content = $request->input('content'); $resume ...

  4. OVR工厂简介

    最近在写分布式架构的应用,顺便写了一个轻量级的集群批量创建影像金字塔的软件,在遥感影像生产中能提升不少效率.以下是软件简介: 由于32位ArcGIS在批量创建影像金字塔中计算力不足和易中断的缺点,在创 ...

  5. leetcode-163周赛-1263-推箱子*

    题目描述: 自己的提交: class Solution: def minPushBox(self, grid: List[List[str]]) -> int: driction = [(0,1 ...

  6. redis常用命令建议

    1. Redis查看当前所有的key KEYS * 2. 查看当前redis的配置信息 CONFIG GET * 3. MISCONF Redis is configured to save RDB ...

  7. XSS的原理分析与解剖(第二篇)

    0×01 前言: 上节(http://www.freebuf.com/articles/web/40520.html)已经说明了xss的原理及不同环境的构造方法.本期来说说XSS的分类及挖掘方法. 当 ...

  8. CentOS7编译安装MPLAYER!!!

    Linux装软件就是折磨人!! Mplayer官网下好release版本 然后./configure --[options] 注意:--prefix=/usr/local/mplayer 是安装路径- ...

  9. 10. Python面向对象

    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.如果接触过java语言同学应该都知道,Java面向对象三大特征是:封装.继承.多态.Pytho ...

  10. 并发编程之Android中AsyncTask使用详解(四)

    更多Android高级架构进阶视频免费学习请点击:[https://space.bilibili.com/474380680] 在Android中我们可以通过Thread+Handler实现多线程通信 ...