RT,本地和洛谷IDE均AC,但提交上去就全为-1
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=3e6+5;
int n,m,s;
int op;
int a[MAXN],cnt,head[MAXN],to[MAXN],nxt[MAXN],len[MAXN],dis[MAXN];
bitset<MAXN>vis;
priority_queue<pair<int,int> >q;
inline void add(int x,int y,int z)
{
to[++cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
len[cnt]=z;
}
inline void build(int p,int l,int r)
{
if(l==r)
{
a[l]=p;
return;
}
int mid=(l+r)>>1;
add(p,p<<1,0);
add(p,p<<1|1,0);
add((p<<1)+MAXN,p+MAXN,0);
add((p<<1|1)+MAXN,p+MAXN,0);
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
}
inline void change(int p,int l,int r,int a,int b,int x,int k)
{
if(l>=a&&r<=b)
{
if(op==2)add(x+MAXN,p,k);
else add(p+MAXN,x,k);
return;
}
int mid=(l+r)>>1;
if(a<=mid)change(p<<1,l,mid,a,b,x,k);
if(b>mid)change(p<<1|1,mid+1,r,a,b,x,k);
}
inline void dijkstra(int s)
{
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty())
{
int x=q.top().second;
q.pop();
if(vis[x])continue;
vis[x]=1;
for(register int i=head[x];i;i=nxt[i])
{
int y=to[i],z=len[i];
if(dis[y]>dis[x]+z)
{
dis[y]=dis[x]+z;
q.push(make_pair(-dis[y],y));
}
}
}
}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&s);
build(1,1,n);
for(register int i=1;i<=n;i++)
{
add(a[i],a[i]+MAXN,0);
add(a[i]+MAXN,a[i],0);
}
for(register int i=1;i<=m;i++)
{
int x,y,l,r,z,k;
scanf("%lld",&op);
if(op==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
add(a[x]+MAXN,a[y],k);
}
else
{
scanf("%lld%lld%lld%lld",&x,&l,&r,&k);
change(1,1,n,l,r,a[x],k);
}
}
dijkstra(a[s]+MAXN);
for(register int i=1;i<=n;i++)
printf("%lld ",dis[a[i]]!=0x3f3f3f3f3f3f3f3fll?dis[a[i]]:-1);
return 0;
}