3073: [Pa2011]Journeys
Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 4 5
5 5 4 4
1 1 3 3
Sample Output
1
2
0
1
HINT
#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;
}