[bzoj3073][Pa2011]Journeys 线段树优化建边的最短路
来源:互联网 发布:淘宝旺铺下载 编辑:程序博客网 时间:2024/05/16 12:22
3073: [Pa2011]Journeys
Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss]
Description
Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路。N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路。Seter保证一条道路不会修建两次,也保证不会有一个国家与自己之间有道路。
Seter好不容易建好了所有道路,他现在在位于P号的首都。Seter想知道P号国家到任意一个国家最少需要经过几条道路。当然,Seter保证P号国家能到任意一个国家。
注意:可能有重边
Input
第一行三个数N,M,P。N<=500000,M<=100000。
后M行,每行4个数A,B,C,D。1<=A<=B<=N,1<=C<=D<=N。
Output
N行,第i行表示P号国家到第i个国家最少需要经过几条路。显然第P行应该是0。
Sample Input
5 3 4
1 2 4 5
5 5 4 4
1 1 3 3
1 2 4 5
5 5 4 4
1 1 3 3
Sample Output
1
1
2
0
1
1
2
0
1
HINT
由于不知道怎么用线段树加边,借鉴了一下其他人的做法
主要思路是搞两棵线段树
不是用来维护东西,而是在上面建边
一个线段树上的节点代表它在线段树上代表的区间的所有点
一棵线段树表示进(从小区间到大区间),另一颗表示出
所以进来的线段树son->fa 长度为0
出去的线段树fa->son长度为0
共用虚点,
进来的线段树->虚点 长度为1
虚点->出去的线段树长度为1
跑最短路,记录原图中每一个节点在出线段树中的编号,输出要除2
#include <bits/stdc++.h>#define pa pair<int,int>using namespace std;const int N = 30000005;int n, m, S, cnt, vir, last[5000000], dis[5000000], vis[5000000], pos[5000000];struct Edge{ int to, next, v; } e[N];void insert( int u, int v, int w ){ e[++cnt].to = v; e[cnt].v = w; e[cnt].next = last[u]; last[u] = cnt; }/*flag 0 -> father in 1 -> son out*/struct Seg_Tree{void build( int k, int l, int r, int flag ){if( l == r ){if( !flag ) pos[l] = k;else insert( (n<<2) + k, k, 0 );return ;}int mid = l + r >> 1;build( k<<1, l, mid, flag );build( k<<1|1, mid+1, r, flag );if( flag ) insert( (n<<2) + k, (n<<2) + (k<<1), 0 ), insert( (n<<2) + k, (n<<2) + (k<<1|1), 0 );else insert( k<<1, k, 0 ), insert( k<<1|1, k, 0 );}void update( int k, int l, int r, int L, int R, int a, int flag ){if( L <= l && r <= R ){if( flag ) insert( a, k + (n<<2), 1 );else insert( k, a, 1 );return ;}int mid = l + r >> 1;if( L <= mid ) update( k<<1, l, mid, L, R, a, flag );if( R > mid ) update( k<<1|1, mid+1, r, L, R, a, flag );}} t1, t2;priority_queue< pa, vector<pa>, greater<pa> > q;void dijkstra(){memset( dis, 63, sizeof(dis) );q.push(make_pair(0,pos[S])); dis[pos[S]] = 0; vis[pos[S]] = 1;while( !q.empty() ){int now = q.top().second; q.pop();for( int i = last[now]; i; i = e[i].next )if( dis[e[i].to] > dis[now] + e[i].v ){dis[e[i].to] = dis[now] + e[i].v;if( !vis[e[i].to] ) q.push(make_pair(dis[e[i].to],e[i].to)), vis[e[i].to] = 1;}}}int main(){scanf( "%d%d%d", &n, &m, &S ); vir = n<<3;t1.build( 1, 1, n, 0 ); t2.build( 1, 1, n, 1 );for( int i = 1, a, b, c, d; i <= m; i++ ){scanf( "%d%d%d%d", &a, &b, &c, &d );t1.update( 1, 1, n, a, b, ++vir, 0 ), t2.update( 1, 1, n, c, d, vir, 1 );t1.update( 1, 1, n, c, d, ++vir, 0 ), t2.update( 1, 1, n, a, b, vir, 1 );}dijkstra();for( int i = 1; i <= n; i++ ) printf( "%d\n", dis[pos[i]]>>1 );return 0;}
阅读全文
0 0
- 【线段树优化建图+最短路】BZOJ3073 [Pa2011]Journeys
- [bzoj3073][Pa2011]Journeys 线段树优化建边的最短路
- 【线段树优化建图+BFS】BZOJ3073(Pa2011)[Journeys]题解
- BZOJ 3073: [Pa2011]Journeys 线段树优化最短路
- BZOJ 3073 [Pa2011]Journeys 最短路 线段树优化建图
- [线段树优化建图最短路 bfs] BZOJ 3073 [Pa2011]Journeys
- 【PA2011】【BZOJ3073】Journeys
- BZOJ3073:Journeys(线段树)
- bzoj 3073: [Pa2011]Journeys 线段树优化建图+堆优化dij
- 3073: [Pa2011]Journeys|线段树|BFS
- [bzoj3073]Journeys
- bzoj 3073: [Pa2011]Journeys
- uestc1558最短路或线段树优化的DP 四川比赛B题
- [最短路 虚树+线段树优化建图] BZOJ 4912 [Sdoi2017]天才黑客
- HDU上的专题训练(背包问题-线段树+树状数组+DP优化+网络流+字符匹配+最短路+矩阵
- HDU5361 In Touch(线段树 + 最短路)
- HDU上的专题训练(背包问题-线段树+树状数组+DP优化+网络流+字符匹配+最短路+矩阵乘法+搜索专题++)
- codevs 1992 聚会 最短路+SPFA优化+反向建边
- 基于MAC的SeetaFace安装与测试(一)
- sublime text3 注册码
- 额 pip的一些问题,
- 安装numpy遇到的文件不存在问题
- 9.11 笔记-屏蔽警告和异常处理
- [bzoj3073][Pa2011]Journeys 线段树优化建边的最短路
- Deleted File Recovery(删除文件数据恢复软件)官方正式版V2.0下载 | Deleted File Recovery破解版
- poj 3228 Gold Transportation 最小生成树+带权并查集 解题报告
- python 迭代器
- mac 上安装selenium, phantomjs 和 chromedriver
- 猪脚为什么总能有奇遇
- 海量数据去重——布隆过滤器以及SimHash
- JAVA 通过命令行设置属性值
- 对xgboost原理的理解