样例二没过求调
  • 板块CF786B Legacy
  • 楼主Cute_Fish
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/5/3 14:40
  • 上次更新2024/5/3 16:51:20
查看原帖
样例二没过求调
1121412
Cute_Fish楼主2024/5/3 14:40

rt,是建图问题。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls rt<<1
#define rs rt<<1|1
#define int ll
const int inf=1e18;
const int N=1e5+7;
int n,q,s,dis[N<<4],vis[N<<4],lf1[N],lf2[N],tot=0;
struct tree{int l,r;}t1[N<<3],t2[N<<3];
struct edge{int to,dis;};
vector<edge>e[N<<4];
inline void build1(int l,int r,int rt){
	if(l>r)return;
	t1[rt].l=l,t1[rt].r=r;
	if(l==r){
		lf1[l]=rt;
		return;
	}
	int mid=(t1[rt].l+t1[rt].r)>>1;
	build1(l,mid,ls);
	build1(mid+1,r,rs);
	e[rt].push_back({ls,0});
	e[rt].push_back({rs,0});
}
inline void build2(int l,int r,int rt){
	if(l>r)return;
	t2[rt].l=l,t2[rt].r=r;
	if(l==r){
		lf2[l]=rt+tot;
		e[lf1[l]].push_back({lf2[l],0});
		e[lf2[l]].push_back({lf1[l],0});
		return;
	}
	int mid=(t2[rt].l+t2[rt].r)>>1;
	build2(l,mid,ls);
	build2(mid+1,r,rs);
	e[ls+tot].push_back({rt+tot,0});
	e[rs+tot].push_back({rt+tot,0});
}
inline void add1(int l,int r,int rt,int from,int x){
	if(t1[rt].l>=l&&t1[rt].r<=r){
		e[from].push_back({rt,x});
		return;
	}
	int mid=(t1[rt].l+t1[rt].r)>>1;
	if(mid>=l)add1(l,r,ls,from,x);
	if(mid<r)add1(l,r,rs,from,x);
}
inline void add2(int l,int r,int rt,int to,int x){
	if(t2[rt].l>=l&&t2[rt].r<=r){
		e[rt+tot].push_back({to,x});
		return;
	}
	int mid=(t2[rt].l+t2[rt].r)>>1;
	if(mid>=l)add2(l,r,ls,to,x);
	if(mid<r)add2(l,r,rs,to,x);
}
inline void Dij(int s){
	for(int i=0;i<N;i++)dis[i]=inf;
	priority_queue<pair<ll,ll>,vector<pair<ll,ll>>,greater<pair<ll,ll>>>q; 
	dis[lf2[s]]=0;
	q.push({0,lf2[s]});
	while(!q.empty()){
		int u=q.top().second;q.pop();	
		if(vis[u])continue;
		vis[u]=1;
		for(auto x:e[u]){
			int v=x.to,w=x.dis;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				q.push({dis[v],v});
			}
		}
	}
}
signed main(){
	cin>>n>>q>>s;
	build1(1,n,1);
	tot=(n<<2);
	build2(1,n,1);
	while(q--){
		int op;cin>>op;
		if(op==1){
			int u,v,w;cin>>u>>v>>w;
			e[lf2[u]].push_back({lf1[v],w});
		}else if(op==2){
			int u,l,r,w;cin>>u>>l>>r>>w;
			add1(l,r,1,lf2[u],w);
		}else{
			int u,l,r,w;cin>>u>>l>>r>>w;
			add2(l,r,1,lf1[u],w);
		}
	}
	Dij(s);
	for(int i=1;i<=n;i++){
		if(dis[lf1[i]]==inf)cout<<-1<<" ";
		else cout<<dis[lf1[i]]<<" ";
	}
}
2024/5/3 14:40
加载中...