算出来静态空间是 200MB 左右,为什么最后两个点会 MLE 呢?
提交记录:https://www.luogu.com.cn/record/198222285
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}
bool mbs;
#define ll long long
const int maxn=5e4+20;
const int maxm=3e6+20;
int l,out[maxn][17],in[maxn][17],f[maxn][17],idx,head[maxm],tot,n,m,s,fa[maxn],dep[maxn];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
struct ques{
int op,u,v,x,y,w;
}q[maxn*10];
int head1[maxn],idx1;
struct edge{
int nxt,to,w;
}e[maxm*4],E[maxn<<1];
inline void add(int u,int v,int w){
// cout<<u<<" "<<v<<" "<<w<<endl;
e[++idx]={head[u],v,w},head[u]=idx;
}
inline void Link(int u,int v){
E[++idx1]={head1[u],v},head1[u]=idx1;
}
void dfs(int u,int fa){
// cout<<fa<<" "<<u<<" begin->\n";
f[u][0]=fa,in[u][0]=++tot,out[u][0]=++tot;
add(in[u][0],u,0),add(in[u][0],f[u][0],0);
add(u,out[u][0],0),add(f[u][0],out[u][0],0);
dep[u]=dep[fa]+1;
for(int i=1;i<=l;i++){
in[u][i]=++tot,out[u][i]=++tot;
f[u][i]=f[f[u][i-1]][i-1];
add(in[u][i],in[u][i-1],0),add(in[u][i],in[f[u][i-1]][i-1],0);
add(out[u][i-1],out[u][i],0),add(out[f[u][i-1]][i-1],out[u][i],0);
}
for(int i=head1[u];i;i=E[i].nxt){
int v=E[i].to;
if(v==fa) continue;
dfs(v,u);
}
}
inline void in_link(int u,int v,int w,int k){
// cout<<u<<" "<<v<<" "<<k<<" begin->\n";
if(dep[u]<dep[v]) swap(u,v);
if(u==v) return add(k,u,0),void();
for(int i=l;i>=0;i--) if(f[u][i]&&dep[f[u][i]]>=dep[v]) add(k,in[u][i],0),u=f[u][i];
if(u==v) return;
for(int i=l;i>=0;i--) if(f[u][i]!=f[v][i]&&f[u][i]) add(k,in[u][i],0),add(k,in[v][i],0),u=f[u][i],v=f[v][i];
add(k,in[u][0],0),add(k,in[v][0],0);
}
inline void out_link(int u,int v,int w,int k){
if(dep[u]<dep[v]) swap(u,v);
if(u==v) return add(u,k,w),void();
for(int i=l;i>=0;i--) if(f[u][i]&&dep[f[u][i]]>=dep[v]) add(out[u][i],k,w),u=f[u][i];
if(u==v) return;
for(int i=l;i>=0;i--) if(f[u][i]!=f[v][i]&&f[u][i]) add(out[u][i],k,w),add(out[v][i],k,w),u=f[u][i],v=f[v][i];
// cout<<out[u][0]<<" "<<out[v][0]<<endl;
add(out[u][0],k,w),add(out[v][0],k,w);
}
#define pai pair<ll,int>
priority_queue<pai,vector<pai>,greater<pai> > Q;
ll dis[maxm];
int vis[maxm];
inline void dijkstra(){
for(int i=1;i<=tot;i++) dis[i]=1e15;
Q.push({0,s}),dis[s]=0;
while(!Q.empty()){
int u=Q.top().second;
Q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
Q.push({dis[v],v});
}
}
}
for(int i=1;i<=n;i++) printf("%lld ",dis[i]==1e15?-1:dis[i]);
printf("\n");
}
bool mbt;
signed main(){
// cout<<(&mbs-&mbt)/1024.0/1024.0<<endl;
n=read(),m=read(),s=read();l=log2(n);
tot=n;
for(int i=1;i<=n;i++) fa[i]=i;
int u,v,w;
for(int i=1;i<=m;i++){
q[i].op=read();
if(q[i].op==1){
q[i]={q[i].op,read(),read(),read(),read(),read()};
if(find(q[i].u)!=find(q[i].v)||find(q[i].x)!=find(q[i].y)) q[i].op=0;
}
else{
u=read(),v=read(),w=read();
if(find(u)!=find(v)) fa[find(u)]=find(v),Link(u,v),Link(v,u),add(u,v,w),add(v,u,w);
}
}
for(int i=n;i>=1;i--) if(!dep[i]) dfs(i,0);
for(int i=1;i<=m;i++) if(q[i].op==1) tot++,out_link(q[i].u,q[i].v,q[i].w,tot),in_link(q[i].x,q[i].y,q[i].w,tot);
dijkstra();
return 0;
}