题意:



思路:

线段树+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的更多相关文章

  1. BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化

    我会告诉你我看了很久很久才把题目看懂吗???怀疑智商了 原来他给的l,r还有k个数字都是下标... 比如给了一个样例 l, r, k, x1,x2,x3...xk,代表的是一个数组num[l]~num ...

  2. 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  3. HDU5669 Road 分层最短路+线段树建图

    分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ​的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维 ...

  4. Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  5. 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 ...

  6. 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra

    [BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在 ...

  7. poj 2886 线段树+反素数

    Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12744   Acc ...

  8. 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra

    [题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...

  9. BZOJ3073: [Pa2011]Journeys(线段树优化建图 Dijkstra)

    题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_ ...

随机推荐

  1. 【DNN发布包解释】package 包裹

    package 包裹 owner 主人 dependency 附属国 azureCompatible 天青兼容 releaseNotes  发行说明 license 许可证 CoreVersion 核 ...

  2. AngularJs轻松入门(八)Cookies读写

    虽然使用JavaScript创建和获取Cookie很简单,AngularJs还是把它作为一个单独的模块进行了封装,模块名为ngCookies,和前面的教程中做法一样,先引入angular-cookie ...

  3. WLAN 感知

    WLAN 感知 通过 Android 8.0 中新增的 WLAN 感知功能,支持设备可以直接使用 WLAN 感知协议发现其他设备.与其他设备进行互连,以及将覆盖范围扩展到其他设备(Android 9 ...

  4. java关闭资源,自制关闭资源工具类

    在网上看到一篇关于关闭资源的正确方式:http://blog.csdn.net/bornforit/article/details/6896775 该博文中的总结: (1)使用finally块来关闭物 ...

  5. ArcGIS api for javascript——动态创建图层列表

    描述 本例循环地图服务里的所有图层并增加每个图层到一个带checkbox的列表,checkbox能设置图层的显示或隐藏.动态创建列表的优势是所有的图层都会包含在列表中,即使服务器管理员删除或增加了图层 ...

  6. ArcGIS api for javascript——加入两个动态地图

    描述 这个示例表现如何加两个动态地图到一个地图.动态服务按用户缩放或平移服务器每次绘制的地图,ArcGISDynamicMapServiceLayer表示ArcGIS JavaScript API动态 ...

  7. 欢迎各位技术牛人增加Swift QQ群:343549891

    急招:五年以上Swift开发经验,24个月工资.30天年假.配司机专车. 欢迎各位技术牛人增加Swift 敏捷大拇指 官方QQ群1: 报上"来自CSDN"就可以.谢谢! 訪问 大拇 ...

  8. AFNetworking框架的使用

    #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...

  9. jQuery - 设置内容和属性 设置内容 - text()、html() 以及 val() , 设置属性 - attr()

    jQuery - 设置内容和属性  设置内容 - text().html() 以及 val() text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTM ...

  10. Sub Thread to update main Thread (UI)

    Sub Thread to update main Thread (UI) main Thread :   A  has Hander.HandleMessage() to process the & ...