[Sdwc] 线段
线段有如下两类特点:
1 x y, 表示第 x 条线段和第 y 条线段相交 (相交在这里指至少有一个公共点)
2 x y,表示第 x 条线段在第 y 条线段的左边,且它们不相交。
共有 m 个特点,每个特点都是如上两类之一。
通过这些特点推理得到每条线段的端点。
x与y相交说明a[x]<b[y]且a[y]<b[x]
x在y左边说明b[x]<a[y]
每条线段x还应满足a[x]<b[x]
这相当于一个拓扑排序问题,小的数相当于安排在前面的任务
输出的第i个数就是第i个任务,那么a[1]尽可能小说明任务1要尽可能早做,b[1]尽可能小说明任务2要尽可能早做……
方法就是把DAG反向建边得到新图,在新图中求字典序最大的拓扑排序,再将这个排序反序输出就是满足要求的答案
IMP:
求一个字典序最小的拓扑排序,正确的做法并不是尽量把小的塞到前面,
而是把大的尽量塞到后面。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
const int N = ;
int point[N],to[N],next[N],cc;
int dui[N],dcc;
int ru[N];
int sc[N];
int n,m;
void AddEdge(int x,int y) {
cc++;
next[cc]=point[x];
point[x]=cc;
to[cc]=y;
ru[y]++;
}
void Add(int x) {
dcc++;
int now=dcc;
int next=now/;
while(next && dui[next]<x) {
dui[now]=dui[next];
now=next;
next=now/;
}
dui[now]=x;
}
int Del() {
int val=dui[];
int now=;
int next=now*;
if(next+<dcc && dui[next+]>dui[next])
next++;
while(next<dcc && dui[next]>dui[dcc]) {
dui[now]=dui[next];
now=next;
next=now*;
if(next+<dcc && dui[next+]>dui[next])
next++;
}
dui[now]=dui[dcc];
dcc--;
return val;
}
int main() {
int i,j;
cin>>n>>m;
while(m--) {
int a,b,c;
cin>>c>>a>>b;
if(c==) {
AddEdge(a*,b*-);
AddEdge(b*,a*-);
} else
AddEdge(b*-,a*);
}
for(i=; i<=n; i++)
AddEdge(i*,i*-);
n*=;
for(i=; i<=n; i++) {
if(!ru[i])
Add(i);
}
for(i=n; i>=; i--) {
if(!dcc) {
printf("Wrong\n");
return ;
}
int now=Del();
int then=point[now];
while(then) {
int tox=to[then];
ru[tox]--;
if(!ru[tox])
Add(tox);
then=next[then];
}
sc[now]=i;
}
for(i=; i<=n; i++) {
cout<<sc[i];
if(i&)
cout<<' ';
else
cout<<endl;
}
return ;
}
[Sdwc] 线段的更多相关文章
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
随机推荐
- DP+线段树维护矩阵(2019牛客暑期多校训练营(第二场))--MAZE
题意:https://ac.nowcoder.com/acm/contest/882/E 给你01矩阵,有两种操作:1是把一个位置0变1.1变0,2是问你从第一行i开始,到最后一行j有几种走法.你只能 ...
- thinkphp5中的raw的作用
模板中输出变量 默认不展示HTMl 使用raw将其中的中的HTMl内容展示出来 <div class="content"> <div class="co ...
- 解决python语言在cmd下中文乱码的问题
解决python语言在cmd下中文乱码的问题: a = "再见!"print (a.decode('utf-8').encode('gbk')) #解决在cmd下中文乱码的问题
- Go语言操作NoSql
NSQ平台 NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作NSQ. NSQ NSQ介绍 NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异. N ...
- vim 插件 入门
vim 手册 vimtutor 精简版本 help user-manual 详细手册 一些vim自带设置 set nu "显示行号 set cursorline "高亮显示当前行 ...
- Spring集成kafka,消费者运行时内存占用会一直增长
Spring集成kafka,消费者运行时内存占用会一直增长? 20C 本人用Spring集成kafka消费者,发布运行时内存占用会一直升高,最后程序挂掉.请各位大神看看,提供解决方法 以下是我的配置文 ...
- python+requests模拟登陆 学校选课系统
最近学校让我们选课,每天都有不同的课需要选....然后突发奇想试试用python爬学校选课系统的课程信息 先把自己的浏览器缓存清空,然后在登陆界面按f12 如图: 可以看到登陆时候是需要验证码的,验证 ...
- 小程序 ----踩坑 ---安卓iOS兼容等
关于小程序一些小功能的代码都在这个GitHub上,感兴趣的可以去看看,https://github.com/huihuijiang/miniProgram目前有:列表左滑删除,拖拽浮标 一.小程序坑1 ...
- selenium在爬虫中的应用之动态数据爬取
一.selenium概念 selenium 是一个基于浏览器自动化的模块 selenium爬虫之间的关联: 1.便捷的获取动态加载的数据 2.实现模拟登录 基本使用 pip install selen ...
- C++ STL 之 容器的深拷贝和浅拷贝
如果我们没有提供拷贝构造函数,没有重载=操作符,vector 对我们的 mc 对象进行的简单的浅拷贝,将拷贝的对象插入到容器中,导致我们的 mc 对象的 data 指针和容器中mc 对象的拷贝对象中的 ...