0pts求条
查看原帖
0pts求条
1209223
iris_hsd楼主2024/11/13 15:37
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e6 + 5, K = 5e6;
int n, m, cnt;
int h[N], e[N], w[N], ne[N], idx;
int a[N];
int d1[N], d2[N], d3[N];
bool v[N];
priority_queue<pair<int, int> > q;

void add(int a, int b, int c)
{
	e[++idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx;
}

void build(int p, int l, int r)
{
	cnt++;
	if(l == r)
	{
		a[l] = p;
		return;
	}
	int mid = l + r >> 1;
	add(p << 1, p, 0);
	add(p << 1 | 1, p, 0);
	build(p << 1, l, mid);
	build(p << 1 | 1, mid + 1, r);
}

void dij1()
{
	memset(d1, 0x3f, sizeof d1);
	d1[a[1]] = 0;
	q.push(make_pair(0, a[1]));
	while(!q.empty())
	{
		int x = q.top().second;
		q.pop();
		if(v[x]) continue;
		v[x] = 1;
		for(int i = h[x]; i; i = ne[i])
		{
			int y = e[i];
			if(d1[y] > d1[x] + w[i])
			{
				d1[y] = d1[x] + w[i];
				q.push(make_pair(-d1[y], y));
			}
		}
	}
}

void dij2()
{
	memset(d2, 0x3f, sizeof d2);
	memset(v, 0, sizeof v);
	d2[a[n]] = 0;
	q.push(make_pair(0, d2[n]));
	while(!q.empty())
	{
		int x = q.top().second;
		q.pop();
		if(v[x]) continue;
		v[x] = 1;
		for(int i = h[x]; i; i = ne[i])
		{
			int y = e[i];
			if(d2[y] > d2[x] + w[i])
			{
				d2[y] = d2[x] + w[i];
				q.push(make_pair(-d2[y], y));
			}
		}
	}
}

void dij3()
{
	for(int i = 1;i <= cnt;i++)
		add(K, i, d1[i] + d2[i]);
	memset(d3, 0x3f, sizeof d3);
	memset(v, 0, sizeof v);
	d3[K] = 0;
	q.push(make_pair(0, K));
	while(!q.empty())
	{
		int x = q.top().second;
		q.pop();
		if(v[x]) continue;
		v[x] = 1;
		for(int i = h[x]; i; i = ne[i])
		{
			int y = e[i];
			if(d3[y] > d3[x] + w[i])
			{
				d3[y] = d3[x] + w[i];
				q.push(make_pair(-d3[y], y));
			}
		}
	}
}

void modify(int p, int l, int r, int lx, int rx, int u, int v)
{
	if(l >= lx && r <= rx)
	{
		add(p, u, v);
		return;
	}
	int mid = l + r >> 1;
	if(mid >= lx) modify(p << 1, l, mid, lx, rx, u, v);
	if(mid < rx) modify(p << 1 | 1, mid + 1, r, lx, rx, u, v);
}

signed main()
{
	ios :: sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	build(1, 1, n);
	for(int i = 1;i <= m;i++)
	{
		int c, p, lft, rgh;
		cin >> c >> p >> lft >> rgh;
		modify(1, 1, n, lft, rgh, a[c], p);
	}
	dij1();
	dij2();
	dij3();
	for(int i = 1;i <= n;i++)
	{
		if(d3[a[i]] >= 0x3f3f3f3f3f3f3f3f) cout<<-1<<"\n";
		else cout<<d3[a[i]]<<"\n";
	}
	return 0;
}
2024/11/13 15:37
加载中...