0pts求条
查看原帖
0pts求条
1209223
iris_hsd楼主2024/11/12 13:44
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e6 + 6, K = 5e5;
int n, k;
int h[N], e[N], w[N], ne[N], idx;
int a[N];
void add(int a, int b, int c){
	e[++idx] = b, w[idx] = c, ne[idx] = h[a];
}
int d1[N], d2[N], dis[N];
bool v1[N], v2[N], v[N];
priority_queue<pair<int, int> > q1, q2;

void build(int p, int l, int r)
{
	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 connect(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) connect(p << 1, l, mid, lx, rx, u, v);
	if(mid < rx) connect(p << 1 | 1, mid + 1, r, lx, rx, u, v);
}

void dij1()
{
	memset(d1, 0x3f, sizeof d1);
	d1[a[1]] = 0;
	q1.push(make_pair(0, a[1]));
	while(!q1.empty())
	{
		int x = q1.top().second;
		q1.pop();
		if(v1[x]) continue;
		v1[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];
				q1.push(make_pair(-d1[y], y));
			}
		}
	}
}

void dij2()
{
	memset(d2, 0x3f, sizeof d2);
	d2[a[n]] = 0;
	q2.push(make_pair(0, a[n]));
	while(!q2.empty())
	{
		int x = q2.top().second;
		q2.pop();
		if(v2[x]) continue;
		v2[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];
				q2.push(make_pair(-d2[y], y));
			}
		}
	}
}

void dij()
{
	priority_queue<pair<int, int> > q;
	for(int i = 1;i <= n;i++){
		dis[a[i]] = d1[a[i]] + d2[a[i]];
		q.push(make_pair(-dis[a[i]], a[i]));
	}
		
	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(dis[y] > dis[x] + w[i])
			{
				dis[y] = dis[x] + w[i];
				q.push(make_pair(-dis[y], y));
			}
		}
	}
}

signed main()
{
	cin >> n >> k;
	build(1, 1, n);
	for(int i = 1;i <= k;i++)
	{
		int c, p, l ,r;
		cin >> c >> p >> l >> r;
		connect(1, 1, n, l, r, a[c], p);
	}
	dij1();
	dij2();
	dij();
	for(int i = 1;i <= n;i++)
	{
		if(d1[a[i]] + d2[a[i]] >= 0x3f3f3f3f3f3f3f3f){
			cout<<-1<<"\n";
		} else cout<<dis[a[i]]<<"\n";
	}
	return 0;
}
2024/11/12 13:44
加载中...