【学术篇】2.28测试T2 线段 拓扑排序
题目:



思路:
看到这种找前后的题目... 第一反应就是拓扑排序_(:з」∠)_
每条线段都有左右两个端点咯, 然后就乱搞吧..
我们用\(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 线段 拓扑排序的更多相关文章
- Day1:T1 模拟 T2 拓扑排序
T1:模拟 自己第一天的简直跟白痴一样啊...模拟都会打错.. 当时貌似在更新最大值的时候打逗比了... if((sum[x]==max && x<maxh) || sum[x] ...
- P3387缩点(tarjan+拓扑排序+线性dp)
题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...
- [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]
题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...
- BZOJ4383 [POI2015]Pustynia[线段树优化建边+拓扑排序+差分约束]
收获挺大的一道题. 这里的限制大小可以做差分约束,从$y\to x$连$1$,表示$y\le x-1$即$y<x$,然后跑最长路求解. 但是,如果这样每次$k+1$个小区间每个点都向$k$个断点 ...
- 【拓扑排序】【线段树】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 ...
- python自动化测试应用-第6篇(WEB测试)--Selenium元素篇
篇6 python自动化测试应用-Selenium基础篇 --lamecho 1.1概要 大家好!我是lamecho(辣么丑),上一篇我们搭建好p ...
- CF798E. Mike and code of a permutation [拓扑排序 线段树]
CF798E. Mike and code of a permutation 题意: 排列p,编码了一个序列a.对于每个i,找到第一个\(p_j > p_i\)并且未被标记的j,标记这个j并\( ...
- BZOJ4383 Pustynia(线段树+拓扑排序)
线段树优化建图暴力拓扑排序即可.对于已确定的数,拓扑排序时dp,每个节点都尽量取最大值,如果仍与已确定值矛盾则无解.叶子连出的边表示大于号,其余边表示大于等于. #include<iostrea ...
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
随机推荐
- bootstrap学习(三)表单
基本实例: from-group:可以是其内的标签排列更好 from-control:使标签宽度为100% <form> <div class="form-group&qu ...
- Spring学习笔记(9)——注入参数
集合类型属性 1.Set类型 private Set<String> sets=new HashSet<String>(); //我们需要给它添加set方法 public Se ...
- SiteMesh 2.X 的使用(网页结构模板)
SiteMesh是基于Servlet的filter的,即过滤流.它是通过截取reponse,并进行装饰后再交付给客户. 其中涉及到两个名词: 装饰页面(decorator page)和 "被 ...
- 自定义DbUtils通用类
本实例使用C3P0连接池做连接,详见https://www.cnblogs.com/qf123/p/10097662.html开源连接池C3P0的使用 DBUtils.java package com ...
- IT书单-持续更新
重构:改善既有代码的设计代码整洁之道深入理解Java虚拟机Java并发编程的艺术<修改代码的艺术><程序员的职业素养>代码大全程序员修炼之道深入理解java虚拟机Java并发编 ...
- dubbo-源码阅读之Filter实现原理
最近完成一个需求,使用阿里Arms需要在log里面加上traceId,但是发现dubbo异常 被ExceptionFilter捕获 并打印 打印不出traceI,然后百度搜索如何重写Filter 参 ...
- pair queue____多源图广搜
.简介 class pair ,中文译为对组,可以将两个值视为一个单元.对于map和multimap,就是用pairs来管理value/key的成对元素.任何函数需要回传两个值,也需要pair. 该函 ...
- (转)ubuntu下如何安装使用SSH?
转:http://os.51cto.com/art/201109/291634.htm ubuntu默认并没有安装ssh服务,如果通过ssh链接ubuntu(比如使用securecrt客户端来访问ub ...
- Java-Class-I:javax.servlet.http.HttpServletRequest
ylbtech-Java-Class-I:javax.servlet.http.HttpServletRequest 1.返回顶部 2.返回顶部 1. package com.ylbtech.ap ...
- docker swarm集群挂载宿主机目录
创建DOCKER集群,挂载宿主机目录src:宿主机目录,dst:容器目录 docker service create --name testrd --detach=false --mount type ...