8分求条
查看原帖
8分求条
655383
wangkangyou楼主2023/11/8 12:53
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
	int sum = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -f;
	for(; isdigit(ch); ch = getchar()) sum = (sum << 3) + (sum << 1) + (ch ^ 48);
	return sum * f;
}
void write(int x){
	if(x < 0) putchar('-'), x = -x;
	if(x > 9) write(x / 10);
	putchar('0' + x % 10);
	return;
}
const int N = 5e5 + 10;
int n, m, p, tmp, num[N];
struct edge{
	int v, w, nx;
}e[N << 5];
int tot, cnt, h[N << 3];
deque<int> dq;
bool vis[(N << 3) + N];
int dis[(N << 3) + N];
void add(int u, int v, int w = 0){
	++ tot;
	e[tot].v = v;
	e[tot].w = w;
	e[tot].nx = h[u];
	h[u] = tot;
	return;
}
void build(int p, int l, int r){
	int ls = p << 1, rs = p << 1 | 1; 
	add(p, ls), add(p, rs);
	add(4 * n + ls, 4 * n + p), add(4 * n + rs, 4 * n + p);
	add(p, 4 * n + p);
	if(l == r){
		num[l] = p + 4 * n;
		return;
	}
	int mid = l + r >> 1;
	build(p << 1, l, mid);
	build(p << 1 | 1, mid + 1, r);
	return; 
}
void update(int p, int l, int r, int x, int y, int op){
	if(y < l || r < x) return;
	if(x <= l && r <= y){
		if(op == 0) add(tmp, p);
		else if(op == 1) add(4 * n + p, tmp, 1);
		return;
	}
	int mid = l + r >> 1;
	update(p << 1, l, mid, x, y, op);
	update(p << 1 | 1, mid + 1, r, x, y, op);
	return;
}
signed main(){
	n = read(), m = read(), p = read();
	cnt = 8 * n;
	build(1, 1, n);
	for(int i = 1, a, b, c, d; i <= m; ++ i){
		a = read(), b = read(), c = read(), d = read();
		tmp = ++ cnt;
		update(1, 1, n, c, d, 0);
		update(1, 1, n, a, b, 1);
		
		tmp = ++ cnt;
		update(1, 1, n, c, d, 1);
		update(1, 1, n, a, b, 0);
	}
	memset(dis, 0x3f, sizeof(dis));
	dis[num[p]] = 0;
	dq.push_front(num[p]);
	while(dq.size()){
		int u = dq.front();
		dq.pop_front();
		if(vis[u]) continue;
		vis[u] = 1;
		
		for(int i = h[u], v, w; i; i = e[i].nx){
			v = e[i].v, w = e[i].w;
			if(dis[v] > dis[u] + w){
				dis[v] = dis[u] + w;
				w ? dq.push_back(v) : dq.push_front(v);
			}
		}
	}
//	for(int i = 1; i <= cnt; ++ i){
//		cout << dis[i] << "\n";
//	}
	for(int i = 1; i <= n; ++ i){
		write(dis[num[i]]);
		puts("");
	}
	return 0;
}
2023/11/8 12:53
加载中...