线段树优化建图求助
  • 板块CF786B Legacy
  • 楼主grzxc
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/10 20:06
  • 上次更新2023/11/3 10:40:39
查看原帖
线段树优化建图求助
728699
grzxc楼主2023/7/10 20:06
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
const int inf=0x3f3f3f3f3f3f3f3f;
const int B=5e5;
int n,m,s,cnt,head[N<<2],yz[N],dis[N<<2],vis[N];
struct node{
	int u,v,w,nxt;
}a[N<<5];
void add(int u,int v,int w){
	a[++cnt]=(node){u,v,w,head[u]};
	head[u]=cnt;
}
void build(int k,int l,int r){
	if(l==r){
		yz[l]=k;
		return ;
	}
	int mid=(l+r)>>1;
	add(k,k<<1,0); add(k,k<<1|1,0);
	add(B+(k<<1),k+B,0); add(B+(k<<1|1),k+B,0);
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
}
void Add(int k,int l,int r,int fl,int fr,int b,int val,int op){
	if(l>=fl&&r<=fr){
		if(op==0){//u -> l,r
			add(b,k,val);
			return ;
		}
		else {
			add(k+B,b,val);
			return ;
		}
	}
	int mid=(l+r)>>1;
	if(fl<=mid)
		Add(k<<1,l,mid,fl,fr,b,val,op);
	if(fr>mid) 
		Add(k<<1|1,mid+1,r,fl,fr,b,val,op);
	return ;
}
priority_queue<pair<int,int> , vector<pair<int,int> > , greater<pair<int,int> > >q;
void dij(int x){
	for(int i=1;i<=N;++i) dis[i]=0x3f;
	dis[x]=0;
	q.push(make_pair(0,x));
	while(!q.empty()){
		int now=q.top().second;
		q.pop();
		if(vis[now]) continue;
		vis[now]=1;
		for(int i=head[now];i;i=a[i].nxt){
			int v=a[i].v;
			if(dis[v]>dis[now]+a[i].w){
				dis[v]=dis[now]+a[i].w;
				q.push(make_pair(dis[v],v));
			}
		}
	}
}
signed main(){
	cin>>n>>m>>s;
	build(1,1,n);
	for(int i=1;i<=m;++i){
		int op,b,l,r,val;
		cin>>op>>b>>l;
		if(op==1){
			cin>>val;
			add(yz[b],yz[l],val);
		}
		else {
			cin>>r>>val;
			Add(1,1,n,l,r,yz[b],val,op%2);
		}
	}
	for(int i=1;i<=n;++i) add(yz[i],yz[i]+B,0),add(yz[i]+B,yz[i],0);
	dij(yz[s]);
	for(int i=1;i<=n;++i){
		if(dis[yz[i]]==inf) cout<<"-1"<<'\n';
		else cout<<dis[yz[i]]<<'\n';
	}
	return 0;
}

样例都过不了Q-Q

2023/7/10 20:06
加载中...