求调
  • 板块CF786B Legacy
  • 楼主suzhikz
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/9 15:35
  • 上次更新2024/6/9 18:54:11
查看原帖
求调
800499
suzhikz楼主2024/6/9 15:35
#include<iostream>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<queue>
#include<vector>
#include<stdio.h>
#include<map>
#include<set>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<bitset>
using namespace std;
const int N=100005;
int n,m,s;
struct nod{
	int l,r;
}tree[N<<2],tree2[N<<2];
int zhuan[N];
void dfs(int ro,int l,int r){
	tree[ro].l=l;tree[ro].r=r;
	tree2[ro].l=l;tree2[ro].r=r;
	if(l==r){
		zhuan[l]=ro;return;
	}
	dfs(ro<<1,l,(l+r)/2);
	dfs(ro*2+1,(l+r)/2+1,r);
}
vector<int>g[N<<3],w[N<<3];
void build(int ro,int l,int r,int s,int L,int R,int co){
	if(L<=l&&r<=R){
		g[zhuan[s]].push_back(ro+N*4);
		w[zhuan[s]].push_back(co);
		cout<<s<<' '<<ro+N*4<<' '<<co<<endl;
		return;
	}
	int mid=(l+r)/2;
	if(L<=mid){
		build(ro<<1,l,mid,s,L,R,co);
	}
	if(R>mid){
		build((ro<<1)+1,mid+1,r,s,L,R,co);
	}
}
void build2(int ro,int l,int r,int L,int R,int t,int co){
	if(L<=l&&r<=R){
		g[ro].push_back(zhuan[t]+N*4);
		w[ro].push_back(co);
		cout<<ro<<' '<<t+N*4<<' '<<co<<endl;
		return;
	}
	int mid=(l+r)/2;
	if(L<=mid){
		build(r<<1,l,mid,L,R,t,co);
	}
	if(R>mid){
		build((r<<1)+1,mid+1,r,L,R,t,co);
	}
}
int dis[N<<3];
bool vis[N<<3];
struct node{
	int id,w;
	friend bool operator<(node a,node b){
		return a.w>b.w;
	}
};
priority_queue<node>q;
void dijkstra(){
	memset(dis,0x3f,sizeof(dis));
	s=zhuan[s];
	node tmp;
	dis[s]=0;
	tmp.id=s;tmp.w=0;
	q.push(tmp);
	while(!q.empty()){
		tmp=q.top();
		q.pop();
		if(vis[tmp.id])continue;
		vis[tmp.id]=1;
	  cout<<tmp.id<<endl;
		int u=tmp.id;
		if(u<=N*4){
			for(int i=0;i<g[u].size();i++){
				int v=g[u][i];
				if(dis[v]>dis[u]+w[u][i]){
					dis[v]=dis[u]+w[u][i];
					tmp.id=v;tmp.w=dis[v];
					q.push(tmp);
				}
			}
			if(tree[u].l==tree[u].r){
				if(dis[u]<dis[u+N*4])dis[u+N*4]=dis[u];
			}else if(u!=1){
				if(dis[u>>1]>dis[u]){
					dis[u>>1]=dis[u];
					tmp.id=u>>1;
					tmp.w=dis[u];
					q.push(tmp);
				}
			}
		}else{
			int u_=u-N*4;
			if(tree2[u_].l==tree2[u_].r){
				if(dis[u_]>dis[u]){
					dis[u_]=dis[u];
					tmp.id=u_;
					tmp.w=dis[u];
					q.push(tmp);
				}
			}else if(u_!=1){
				int ls=u_<<1,rs=u_*2+1;
				if(dis[ls+N*4]>dis[u]){
					dis[ls+N*4]=dis[u];
					tmp.id=ls+N*4;
					tmp.w=dis[u];
					q.push(tmp);
				}
				if(dis[rs+N*4]>dis[u]){
					dis[rs+N*4]=dis[u];
					tmp.id=rs+N*4;
					tmp.w=dis[u];
					q.push(tmp);
				}
			}
		}
	}
}
int main(){
	cin>>n>>m>>s;
	dfs(1,1,n);
	for(int op,l,r,s,t,w,i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>s>>t>>w;
			build(1,1,n,s,t,t,w);
		}else if(op==2){
			cin>>s>>l>>r>>w;
			build(1,1,n,s,l,r,w);
		}else{
			cin>>t>>l>>r>>w;
			build2(1,1,n,l,r,t,w);
		}
	}
	dijkstra();
	for(int i=1;i<=n;i++)cout<<dis[zhuan[i]]<<endl;
	
	return 0;
}
2024/6/9 15:35
加载中...