POJ 2374 线段树建图+Dijkstra
题意:
思路:
线段树+Dijkstra(要堆优化的)
线段树要支持打标记
一个栅栏 拆成两个点 :左和右
新加一个栅栏的时候 看看左端点有没有被覆盖过
如果有的话 就分别从覆盖的那条线段的左右向当前的左端点连一条边权为距离的边
右端点同理
跑一遍Dijkstra 就好啦
复杂度:O(nlogn)
//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100500;
int n,s,xx,tree[N*16],first[N],next[N*4],v[N*4],w[N*4],tot,dis[N],vis[N];
struct Fence{int l,r;}fence[N];
struct Node{int now,weight;Node(){}Node(int x,int y){now=x,weight=y;}}jy;
bool operator < (Node a,Node b){return a.weight>b.weight;}
void insert(int l,int r,int pos){
if(l>=fence[xx].l&&r<=fence[xx].r){tree[pos]=xx;return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<fence[xx].l)insert(mid+1,r,rson);
else if(mid>=fence[xx].r)insert(l,mid,lson);
else insert(l,mid,lson),insert(mid+1,r,rson);
}
int query(int l,int r,int pos,int x){
if(l==r){return tree[pos];}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(tree[pos])tree[lson]=tree[rson]=tree[pos],tree[pos]=0;
if(x<mid)return query(l,mid,lson,x);
else return query(mid+1,r,rson,x);
}
void add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void deal(){
int tempx=query(-N,N,1,fence[xx].l);
add(tempx<<1,xx<<1,abs(fence[tempx].l-fence[xx].l));
add(tempx<<1|1,xx<<1,abs(fence[tempx].r-fence[xx].l));
int tempy=query(-N,N,1,fence[xx].r);
add(tempy<<1,xx<<1|1,abs(fence[tempy].l-fence[xx].r));
add(tempy<<1|1,xx<<1|1,abs(fence[tempy].r-fence[xx].r));
insert(-N,N,1);
}
void Dijkstra(){
memset(dis,0x3f,sizeof(dis)),dis[0]=0;
priority_queue<Node>pq;pq.push(jy);
while(!pq.empty()){
Node t=pq.top();pq.pop();
if(vis[t.now])continue;
vis[t.now]=1;
for(int i=first[t.now];~i;i=next[i])
if(!vis[v[i]]&&dis[v[i]]>dis[t.now]+w[i]){
dis[v[i]]=dis[t.now]+w[i];
pq.push(Node(v[i],dis[v[i]]));
}
}
}
int main(){
scanf("%d%d",&n,&s);
memset(first,-1,sizeof(first)),add(0,1,0);
for(xx=1;xx<=n;xx++)scanf("%d%d",&fence[xx].l,&fence[xx].r),deal();
xx++,fence[xx].l=fence[xx].r=s;deal(),add(xx<<1,xx<<1|1,0);
Dijkstra();
printf("%d\n",dis[xx<<1|1]);
}
POJ 2374 线段树建图+Dijkstra的更多相关文章
- BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化
我会告诉你我看了很久很久才把题目看懂吗???怀疑智商了 原来他给的l,r还有k个数字都是下标... 比如给了一个样例 l, r, k, x1,x2,x3...xk,代表的是一个数组num[l]~num ...
- 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- HDU5669 Road 分层最短路+线段树建图
分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) 的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维 ...
- Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- Codeforces Round #406 (Div. 2) D. Legacy (线段树建图dij)
D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra
[BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在 ...
- poj 2886 线段树+反素数
Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12744 Acc ...
- 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra
[题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...
- BZOJ3073: [Pa2011]Journeys(线段树优化建图 Dijkstra)
题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_ ...
随机推荐
- 将毫秒时间转换为yyyy-MM-dd HH:mm:ss格式
/** * 将毫秒时间转换为yyyy-MM-dd HH:mm:ss格式 */ public static String getDateFromTimeMillis(Long timeMillis) { ...
- 求第区间第k大数 TLE归并树
题 给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入: 第一行包含两个正整数N.M,分别表示序列的长度和查询的个数. 第二行包含N个正整数,表示这个序列各项的数字. 接下来M ...
- 《转载》编程入门指南 v1.4
编程入门指南 v1.4 Badger · 8 个月前 作者:@萧井陌, @Badger 自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 CoCode ...
- spring-data-jpa 新增 修改 删除 查询 分页
1.查询所有数据 findAll() 2.分页查询 findAll(new PageRequest(0, 2)) 3.根据id查询 findOne() 4.根据实体类属性查询: findByPro ...
- 安装虚拟机(VM)(一)
原创作品,允许转载,转载时请务必声明作者信息和本声明. https://www.cnblogs.com/zhu520/p/10728248.html 本人小白,有错指出.谢谢! 一:安装虚拟机前奏 ...
- 修改cloudera manager的端口号
最近想在测试机装一个hadoop测试集群debug玩玩,然后就用cloudera manager装吧 这回使用rpm安装失败了,在网上搜到Cloudera Manager 5和CDH5离线安装说需要用 ...
- jquery快速清除复选框、单选框的选中
$(":checked").attr("checked", "");
- POJ3904 Sky Code【容斥原理】
题目链接: http://poj.org/problem?id=3904 题目大意: 给你N个整数.从这N个数中选择4个数,使得这四个数的公约数为1.求满足条件的 四元组个数. 解题思路: 四个数的公 ...
- 《TCP/IP具体解释》读书笔记(19章)-TCP的交互数据流
在TCP进行传输数据时.能够分为成块数据流和交互数据流两种.假设按字节计算.成块数据与交互数据的比例约为90%和10%,TCP须要同一时候处理这两类数据,且处理的算法不同. 书籍本章中以Rlogin应 ...
- 基于CC2530的ZigBee转以太网网关的设计与实现
*已刊登至:<无线电>8月刊 物联网技术的实现中,无线技术是必不可少的部分. 近年无线技术的发展,将ZigBee推入人们的视线中.那么ZigBee是如何的一种技术呢?带着疑问.我查询了它的 ...