【学术篇】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.对于序列{ ...
随机推荐
- Optional int parameter 'pId' is present but cannot be translated into a null value due to being declared as a primitive type.
接口测试的时候遇到了一个问题,导致测试阻断了好久,在此记录,谨防忘记. 具体报错如下: Optional int parameter 'pId' is present but cannot be tr ...
- Spring学习笔记(9)——注入参数
集合类型属性 1.Set类型 private Set<String> sets=new HashSet<String>(); //我们需要给它添加set方法 public Se ...
- Python之os.path.join()
os.path.join()函数用于路径拼接文件路径. os.path.join()函数中可以传入多个路径: 会从第一个以”/”开头的参数开始拼接,之前的参数全部丢弃. 以上一种情况为先.在上一种情况 ...
- 5、springcloud整合mybatis注解方式
1.上一篇学习了服务提供者provider,但是并不是单单就学习了服务提供者.中间还穿插使用了Hikari数据源和spring cloud整合mybatis.但是上篇使用mybatis时还是沿用了老的 ...
- LeetCode Array Easy 88. Merge Sorted Array
Description Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted ar ...
- Socket网络编程--初级
如果想开发一个基于TCP/IP协议的网络程序,应用程序之间则主要通过Socket交换数据 .NET Socket支持四种编程模式 1.居于阻塞模式的Socket编程 2.”非阻塞“模式的Socket编 ...
- texinfo - 软件文档系统
DESCRIPTION 描述 Texinfo 是一种文档系统,使用单一的源文件来产生在线文档以及可打印的输出.它主要用于书写软件使用手册. 要查看 Texinfo 语言和相关工具的全面描述,请查看 T ...
- [python3]未配置locale的主机出现UnicodeDecodeError: 'ascii' codec can't decode byte 0x....的解决
之前写的发邮件的程序部署到vps的时候出现了 UnicodeDecodeError: 'ascii' codec can't decode byte 0x.... 的错误. 按理说UnicodeDec ...
- poj 3744 矩阵快速幂+概率dp
题目大意: 输入n,代表一位童子兵要穿过一条路,路上有些地方放着n个地雷(1<=n<=10).再输入p,代表这位童子兵非常好玩,走路一蹦一跳的.每次他在 i 位置有 p 的概率走一步到 i ...
- macOS截屏
Command+Shift+3: 全屏幕截屏,并自动保存在桌面 Command+Shift+4: 手动截屏,并自动保存在桌面 Command+Shift+4, + Space, 之后点击程序的窗口,实 ...