交上去,CF 显示样例 T 了,然而我本地跑得飞快。
CF:https://codeforces.com/contest/786/submission/216941672
Luogu:https://www.luogu.com.cn/record/118782203
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define int long long
#define PII pair<int,int>
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=1e6+5,D=5e5;
int head[N],len;
struct node {
int to,w,nxt;
}; node edge[N];
void add_edge(int u,int v,int w) {
edge[++len]={v,w,head[u]}; head[u]=len;
}
int dis[N];
void dijkstra(int s) {
priority_queue<PII,vector<PII>,greater<PII>> heap;
cl(dis,0x3f); dis[s]=0; heap.push({0,s});
while(!heap.empty()) {
int u=heap.top().second,d=heap.top().first; heap.pop();
if(dis[u]!=d)
continue;
for(int i=head[u];i;i=edge[i].nxt) {
int v=edge[i].to,w=edge[i].w;
if(dis[v]>dis[u]+w) {
dis[v]=dis[u]+w; heap.push({dis[v],v});
}
}
}
}
#define ls(k) (k<<1)
#define rs(k) (k<<1|1)
int leaf[N];
void build(int k,int l,int r) {
if(l==r) {
leaf[l]=k; add_edge(k,k+D,0); add_edge(k+D,k,0); return;
}
int mid=(l+r)>>1;
add_edge(k,ls(k),0); add_edge(k,rs(k),0);
add_edge(ls(k)+D,k+D,0); add_edge(rs(k)+D,k+D,0);
build(ls(k),l,mid);
build(rs(k),mid+1,r);
}
void update(int k,int l,int r,int qx,int ql,int qr,int op,int val) {
if(ql<=l&&r<=qr) {
if(op==0) //[l,r]->v
add_edge(qx+D,k,val);
else //v->[l,r]
add_edge(k+D,qx,val);
return;
}
int mid=(l+r)>>1;
if(ql<=mid)
update(ls(k),l,mid,qx,ql,qr,op,val);
if(qr>=mid+1)
update(rs(k),mid+1,r,qx,ql,qr,op,val);
}
signed main() {
int n,q,s;
scanf("%d%d%d",&n,&q,&s);
build(1,1,n);
while(q--) {
int op;
scanf("%d",&op);
if(op==1) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add_edge(leaf[u],leaf[v],w);
} else {
int v,l,r,w;
scanf("%d%d%d%d",&v,&l,&r,&w);
update(1,1,n,leaf[v],l,r,op&1,w);
}
}
dijkstra(leaf[s]);
rep(i,1,n)
printf("%lld ",dis[leaf[i]]==INFLL? -1:dis[leaf[i]]);
return 0;
}