求助!!!
  • 板块CF786B Legacy
  • 楼主TBXX
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/10 17:16
  • 上次更新2023/11/3 10:42:45
查看原帖
求助!!!
319682
TBXX楼主2023/7/10 17:16

一直RE 据说要加离散化

#include <bits/stdc++.h>
#define int long long
#define mod 1000000007
#define P pair<long long, int>
#define oo 0x7fffffff
using namespace std;

int read()
{
	int x = 0;
	char c = getchar(); 
	while(c < '0' || c > '9')
		c = getchar();
	while(c >= '0' && c <= '9')
	{
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x;
}

int n, m, s, rt1, rt2, nn, tot, head[100005];
int rs[6000005], ls[6000005];

struct edge
{
	int v, w, nxt;
}e[6000005];

void add(int u, int v, int w)
{
	e[++tot].v = v;
	e[tot].w = w;
	e[tot].nxt = head[u];
	head[u] = tot;
}

void buildin(int &rt, int l, int r)
{
	if(l == r)
	{
		rt = l;
		return;
	}
	rt = ++nn;
	int mid = (l + r) >> 1;
	buildin(ls[rt], l, mid);
	buildin(rs[rt], mid+1, r);
	add(ls[rt], rt, 0);
	add(rs[rt], rt, 0);
}

void buildout(int &rt, int l, int r)
{
	if(l == r)
	{
		rt = l;
		return;
	}
	rt = ++nn;
	int mid = (l + r) >> 1;
	buildout(ls[rt], l, mid);
	buildout(rs[rt], mid+1, r);
	add(rt, ls[rt], 0);
	add(rt, rs[rt], 0);
}

int ll, rr;

void update(int rt, int l, int r, int v, int w, int type)
{
	if(ll <= l and r <= rr)
	{
		if(type == 2)
			add(v, rt, w);
		else
			add(rt, v, w);
		return;
	}
	int mid = (l + r) >> 1;
	if(ll <= mid)
		update(ls[rt], l, mid, v, w, type);
	if(rr > mid)
		update(rs[rt], mid+1, r, v, w, type);
}

priority_queue<P, vector<P>, greater<P> > q;
int dis[300005];
bool vis[300005];
int ans, sum;
 
void dij(int s)
{
	for(int i = 0; i <= n; i++)
		dis[i] = oo;
	dis[s] = 0;
	q.push(make_pair(0, s));
	while(!q.empty())
	{
		int cur = q.top().second;
		q.pop();
		if(vis[cur])
			continue;
		vis[cur] = 1;
		for(int i = head[cur]; i; i = e[i].nxt)
		{
			int v = e[i].v;	
			dis[v] = min(dis[v], dis[cur] + e[i].w);
			q.push(make_pair(dis[v], v));
		}
	}
	for(int i = 1; i <= n; i++)
	{
		if(dis[i] == oo)
			cout << -1 << ' ';
		else
			cout << dis[i] << ' ';
	}
}

signed main()
{
	n = read(), m = read(), s = read();
	nn = n;
	buildin(rt1, 1, n);
	buildout(rt2, 1, n);
	for(int i = 1; i <= m; i++)
	{
		int type, u, v, l, r, w;
		type = read();
		if(type == 1)
		{
			u = read(), v = read(), w = read();
			add(u, v, w);
		}
		else if(type == 2)
		{
			v = read(), ll = read(), rr = read(), w = read();
			update(rt2, 1, n, v, w, type);
		}
		else
		{
			v = read(), ll = read(), rr = read(), w = read();
			update(rt1, 1, n, v, w, type);
		}
	}
	dij(s);
	cout << sum << ' ' << ans;
	return 0;
}
2023/7/10 17:16
加载中...