#7 wa求调
  • 板块CF786B Legacy
  • 楼主BartAllen
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/12 00:11
  • 上次更新2024/7/12 09:39:25
查看原帖
#7 wa求调
167697
BartAllen楼主2024/7/12 00:11
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const ll N = 1e6 + 5;

ll n, q, s, cnt, r1, r2, tot;
ll head[N], ver[N * 3], edge[N * 3], nxt[N * 3], d[N];
ll _left[N], _right[N];
bool vis[N];

void add(ll x, ll y, ll z) {
	ver[++tot] = y, edge[tot] = z, nxt[tot] = head[x], head[x] = tot;
}

void update_in(ll p) {
	add(p, _left[p], 0); add(p, _right[p], 0);
}

void update_out(ll p) {
	add(_left[p], p, 0); add(_right[p], p, 0);
}

void build_in(ll &p, ll l, ll r) {
	if (l == r) {
		p = l;
		return;
	}
	p = ++cnt;
	ll mid = (l + r) / 2;
	build_in(_left[p], l, mid);
	build_in(_right[p], mid + 1, r);
	update_in(p);
}

void build_out(ll &p, ll l, ll r) {
	if (l == r) {
		p = l;
		return;
	}
	p = ++cnt;
	ll mid = (l + r) / 2;
	build_out(_left[p], l, mid);
	build_out(_right[p], mid + 1, r);
	update_out(p);
}

ll _l, _r, opt;

void change(ll p, ll l, ll r, ll u, ll w) {
	if (_l <= l && _r >= r) {
		if (opt == 2) add(u, p, w);
		else add(p, u, w);
		return;
	}
	ll mid = (l + r) / 2;
	if (_l <= mid) change(_left[p], l, mid, u, w);
	if (_r > mid) change(_right[p], mid + 1, r, u, w);
}

priority_queue <pair<ll, ll> > heap;

void dij() {
	memset(d, 0x7f, sizeof(d));
	memset(vis, 0, sizeof(vis));
	d[s] = 0;
	heap.push(make_pair(0, s));
	while (!heap.empty()) {
		ll x = heap.top().second; heap.pop();
		if (vis[x]) continue;
		vis[x] = 1;
		for (ll i = head[x]; i; i = nxt[i]) {
			ll y = ver[i], z = edge[i];
			if (d[y] > d[x] + z) {
				d[y] = d[x] + z;
				heap.push(make_pair(-d[y], y));
			}
		}
	}
}

signed main() {
	scanf("%lld%lld%lld", &n, &q, &s);
	cnt = n;
	memset(head, -1, sizeof(head));
	build_in(r1, 1, n);
	build_out(r2, 1, n);
	for (ll i = 1; i <= q; i++) {
		scanf("%lld", &opt);
		if (opt == 1) {
			ll v, u, w;
			scanf("%lld%lld%lld", &v, &u, &w);
			add(v, u, w);
		}
		else {
			ll v, w;
			scanf("%lld%lld%lld%lld", &v, &_l, &_r, &w);
			if (opt == 2) change(r1, 1, n, v, w);
			else change(r2, 1, n, v, w); 
		}
	}
	dij();
	for (ll i = 1; i <= n; i++) {
		if (d[i] >= 0x7f7f7f7f) printf("-1 ");
		else printf("%lld ", d[i]);
	}
	return 0;
}
2024/7/12 00:11
加载中...