编译错误 求调
查看原帖
编译错误 求调
816504
封禁用户楼主2024/8/15 16:47
#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int N=1e5+5;
int pla[3][N],n;
bool vis[N];long long dis[N];
struct Tree{
	int ls,rs;
}tree[9*N];
struct node{
	int to,next;
	long long w;
}edge[900010];//edge[8*N+1e5+5];
int head[N],tot;
void add(int u,int v,long long w){
	edge[++tot]=(node){v,w,head[u]};
	head[u]=tot;
}
struct Heap{long long sum;int id;};
struct cmp{
	bool operator()(Heap a,Heap b)
	{
		return a.sum>b.sum;
	}
};
priority_queue<Heap,vector<Heap>,cmp>q;
void dij(int s){
	for(int i=0;i<=n;i++)
		dis[i]=1e14+5;
	memset(vis,0,sizeof(vis));
	dis[s]=0;
	q.push((Heap){0,s});
	while(q.size())
	{
		int u=q.top().id;q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=head[u];i;i=edge[i].next)
		{
			int v=edge[i].to;
			if(!vis[v]&&dis[v]>dis[u]+edge[i].w)
			{
				dis[v]=dis[u]+edge[i].w;
				q.push((Heap){dis[v],v});
			}
		}
	}
}
void build(int fa,int x,int l,int r,int ki){
	if(ki==1) add(fa,x,0);
	else add(x,fa,0);
	if(l==r)
	{
		pla[ki][l]=x;
		return ;
	}
	int mid=(l+r)/2;
	tree[x].ls=tot+1;(x,++tot,l,mid,ki);
	tree[x].rs=tot+1;(x,++tot,mid+1,r,ki);
}
void put(int x,int l,int r,int L,int R,int w,int ki,int to){
	if(L<=l&&r<=R)
	{
		if(ki==1)add(to,x,w);
		else add(x,to,w);
		return ;
	}
	int mid=(l+r)/2;
	if(l<=mid) put(tree[ki].ls,l,mid,L,R,w,ki,to);
	if(r>=mid+1) put(tree[ki].rs,mid+1,r,L,R,w,ki,to);
}
int main()
{
	int m,s,tool1,tool2;
	scanf("%d %d %d",&n,&m,&s);
	tool1=1;build(0,tool1,1,n,1);
	tool2=++tot;build(0,tool2,1,n,2);
	for(int i=1;i<=n;i++)
	{
		int l1=pla[1][i],l2=pla[2][i];
		add(l1,l2,0);
		add(l2,l1,0);
	}
	for(int i=1;i<=m;i++)
	{
		int ol,u,v,l,r;
		long long w;
		scanf("%d",&ol);
		if(ol==1)
		{
			scanf("%d %d %lld",&u,&v,&w);
			add(pla[1][u],pla[2][v],w);
		}
		if(ol==2)
		{
			scanf("%d %d %d %lld",&u,&l,&r,&w);
			put(tool1,1,n,l,r,w,1,pla[2][u]);
		}
		if(ol==3)
		{
			scanf("%d %d %d %lld",&u,&l,&r,&w);
			put(tool2,1,n,l,r,w,2,pla[1][u]);
		}
	}
	dij(s);
	for(int i=1;i<=n;i++)
	{
		if(i>=1e14) printf("-1 ");
		else printf("%lld ",dis[i]);
	}
}
2024/8/15 16:47
加载中...