线段树优化建图爆炸求掉
查看原帖
线段树优化建图爆炸求掉
547238
篮网总冠军楼主2025/8/29 12:38
#include <bits/stdc++.h>
using namespace std;

int cnt;
int root1,root2;
struct node{
	int l,r,ls,rs;
}tree[800005];
vector<int>a[800005],b[800005];
int in[200005],out[200005];
void build1(int l,int r,int w){
	tree[w].l=l,tree[w].r=r;
	if (l==r){
		in[l]=w;
		return;
	}
	int mid=(l+r)/2;
	tree[w].ls=++cnt;
	tree[w].rs=++cnt;
	a[w].push_back(tree[w].ls);
	a[w].push_back(tree[w].rs);
	b[w].push_back(0);
	b[w].push_back(0);
	build1(l,mid,tree[w].ls);
	build1(mid+1,r,tree[w].rs);
}
void build2(int l,int r,int w){
	tree[w].l=l,tree[w].r=r;
	if (l==r){
		out[l]=w;
		return;
	}
	int mid=(l+r)/2;
	tree[w].ls=++cnt;
	tree[w].rs=++cnt;
	a[tree[w].ls].push_back(w);
	a[tree[w].rs].push_back(w);
	b[tree[w].ls].push_back(0);
	b[tree[w].rs].push_back(0);
	build2(l,mid,tree[w].ls);
	build2(mid+1,r,tree[w].rs);
}
void update1(int from,int l,int r,int w,int s){
	if (tree[w].l>=l&&tree[w].r<=r){
		a[from].push_back(w);
		b[from].push_back(s);
		return;
	}
	int mid=(tree[w].l+tree[w].r)/2;
	if (l<=mid) update1(from,l,r,tree[w].ls,s);
	if (mid<r) update1(from,l,r,tree[w].rs,s);
}
void update2(int from,int l,int r,int w,int s){
	if (tree[w].l>=l&&tree[w].r<=r){
		a[w].push_back(from);
		b[w].push_back(s);
		return;
	}
	int mid=(tree[w].l+tree[w].r)/2;
	if (l<=mid) update2(from,l,r,tree[w].ls,s);
	if (mid<r) update2(from,l,r,tree[w].rs,s);
}
struct wtz{
	int w;
	long long dis;
	friend bool operator<(wtz x,wtz y){
		return x.dis>y.dis;
	}
};
long long oo=1e18,dis[800005];
bool vis[800005];
priority_queue<wtz>q;
void dij(int s){
	for(int i=1;i<=cnt;i++) dis[i]=oo;
	dis[s]=0;
	wtz p;p.w=s,p.dis=0;q.push(p);
	while(!q.empty()){
		wtz rt=q.top();
		q.pop();
		if (vis[rt.w]) continue;
		vis[rt.w]=1;
		for(int i=0;i<a[rt.w].size();i++){
			if (dis[rt.w]+b[rt.w][i]<dis[a[rt.w][i]]){
				dis[a[rt.w][i]]=dis[rt.w]+b[rt.w][i];
				wtz nm;
				nm.w=a[rt.w][i];nm.dis=dis[nm.w];
				q.push(nm);
			}
		}
	}
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	int n,m,s;
	cin>>n>>m>>s;
	build1(1,n,root1=++cnt);
	build2(1,n,root2=++cnt);
	for(int i=1;i<=n;i++){
		a[in[i]].push_back(out[i]);
		a[out[i]].push_back(in[i]);
		b[in[i]].push_back(0);
		b[out[i]].push_back(0);
	}
	for(int i=1;i<=m;i++){
		int op;
		cin>>op;
		if (op==1){
			int u,v,w;
			cin>>u>>v>>w;
			a[in[u]].push_back(out[v]);
			b[in[u]].push_back(w);
		}
		else if (op==2){
			int u,l,r,w;
			cin>>u>>l>>r>>w;
			update1(in[u],l,r,root2,w);
		}
		else{
			int l,r,u,w;
			cin>>l>>r>>u>>w;
			update2(out[u],l,r,root1,w);
		}
	}
	dij(in[s]);
	for(int i=1;i<=n;i++) cout<<(dis[out[i]]>=oo?-1:dis[out[i]])<<" ";
	return 0;
}

2025/8/29 12:38
加载中...