倍增优化建图,求算空间
查看原帖
倍增优化建图,求算空间
688596
dayz_break404楼主2025/1/14 18:49

算出来静态空间是 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;
}
2025/1/14 18:49
加载中...