POJ 2374 线段树建图+Dijkstra
来源:互联网 发布:mac版pscc下载 编辑:程序博客网 时间:2024/05/20 14:27
题意:
思路:
线段树+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]);}
0 0
- POJ 2374 线段树建图+Dijkstra
- POJ 1556 线段与线段相交 + dijkstra
- POJ 1556 The Doors (线段相交+Dijkstra)
- POJ 1556 The Doors (判断线段相交+dijkstra)
- Dijkstra POJ
- poj 3159 heap+dijkstra
- poj 2253 - Frogger --- dijkstra
- poj 3268 dijkstra
- POJ 1847 Dijkstra应用
- poj 1847(Tram) Dijkstra
- poj 2253 : Frogger (dijkstra)
- poj 1125 dijkstra
- POJ 3268 dijkstra算法
- POJ 1502 dijkstra()
- POJ 1797 dijkstra()变形
- dijkstra-poj-2263
- POJ 1125 暴力+Dijkstra
- POJ 2502 Dijkstra
- x86中断(一)-中断分类
- 在文件中查找单词及其行数
- 【php】Centos系统下Lamp环境的快速搭建
- C指针
- android 连续点击N次去执行某任务
- POJ 2374 线段树建图+Dijkstra
- 数据库链接管理类Twisted adbapi.ConnectionPool
- java 加密 RSA(一)
- jzoj 4832. 【NOIP2016提高A组集训第3场10.31】高维宇宙 网络流或状压dp
- wifi详解-1(基本常识)
- Android Studio创建Assets Folder、JNI文件夹、AIDL文件夹
- 算法基础
- Ajax使用FormData对象实现无刷新上传文件
- Linux学习--第八天--acl、SetUID、SetGID、chattr、lsattr、sudo