求助线段树优化建图 WA on #4
  • 板块CF786B Legacy
  • 楼主int08
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/22 14:28
  • 上次更新2024/1/22 17:06:57
查看原帖
求助线段树优化建图 WA on #4
508032
int08楼主2024/1/22 14:28

码风复古(?我同学评价的

#4 号点该输出 -1 的输出了一个较大的值。

#include<bits/stdc++.h>
#define int long long
#define int08 508032
#define inf (0x3f3f3f3f3f3f3f3f)
using namespace std;
struct edge{
	int v,w;
};
struct tree{
	int l,r;
}t[1919810];
vector<edge> e[916414];
int p[114514],n;
void connect(int u,int v,int w)
{
	e[u].push_back({v,w});
}
void build(int l,int r,int o)
{
	t[o].l=l;t[o].r=r;
	if(l==r)
	{
		p[l]=o;
		return;
	}
	int mid=(l+r)>>1;
	build(mid+1,r,o*2+1);
	build(l,mid,o*2);
	connect(o,o*2,0);
	connect(o,o*2+1,0);
	connect(o*2+1+int08,o+int08,0);
	connect(o*2+int08,o+int08,0);
}

void change(int l,int r,int o,int w,int op,int u)
{
	if(l>=t[o].l&&r<=t[o].r)
	{
		if(op==2) connect(p[u],o,w);
		else connect(o+int08,p[u],w);
		return;
	}
	int mid=(t[o].l+t[o].r)>>1;
	if(r>mid) change(mid+1,r,o*2+1,w,op,u);
	if(l<=mid) change(l,mid,o*2,w,op,u);
}

priority_queue <pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;

int k,dis[1616414],vis[1616414],q,s,i,j,v,l,r,w,op;

void dijkstra(int s)
{
	pq.push({0,s});
	while(!pq.empty())
	{
		int du=pq.top().first,u=pq.top().second;
		pq.pop();
		if(vis[u]) continue;
		dis[u]=du;vis[u]=1;
		for(auto v:e[u])
		{
			pq.push({dis[u]+v.w,v.v});
		}
	}
}
signed main()
{
	cin>>n>>q>>s;
	build(1,n,1);
	for(i=1;i<=n;i++)
	connect(p[i],p[i]+int08,0),connect(p[i]+int08,p[i],0);
	for(j=1;j<=q;j++)
	{
		cin>>op>>v>>l;
		if(op>1) cin>>r;
		cin>>w;
		if(op>1)
		change(l,r,1,w,op,v);
		else connect(p[v]+int08,p[l],w);
	}
	for(i=1;i<=2*int08;i++) dis[i]=inf;
	dis[p[s]]=0;
	dijkstra(p[s]);
	for(i=1;i<=n;i++)
	cout<<((dis[p[i]]==inf)?(-1):(dis[p[i]]))<<" ";
	return 0;
}
2024/1/22 14:28
加载中...