样例不过求条,玄关
  • 板块CF786B Legacy
  • 楼主doooge
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/7/25 17:15
  • 上次更新2025/7/25 22:15:12
查看原帖
样例不过求条,玄关
1286553
doooge楼主2025/7/25 17:15

马蜂不好见谅

#include<bits/stdc++.h>
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
using namespace std;
const int N=4e5+10;
struct ll{
	int x,w;
	bool operator<(const ll &a)const{
		return w>a.w;
	}
};
vector<ll>v[1000010];
int dis[N<<1],t[N],t2[N],a[N],n,m,op,pos,s,w;
bool f[N<<1];
void build(int l,int r,int fa){
	if(l==r){
		a[l]=fa;
		v[a[l]+N].push_back({a[l],0});
		return;
	}
	v[fa].push_back({ls(fa),0});
	v[fa].push_back({rs(fa),0});
	v[ls(fa)+N].push_back({fa+N,0});
	v[rs(fa)+N].push_back({fa+N,0});
	int mid=(l+r)>>1;
	build(l,mid,ls(fa));
	build(mid+1,r,rs(fa));
	return;
}
void add(int l,int r,int L,int R,int fa){
	if(L>=l&&R<=r){
//		cout<<L<<' '<<R<<' '<<fa<<'\n';
		if(op==2)v[pos+N].push_back({fa,w});
		else v[fa+N].push_back({pos,w});
		return;
	}
	int mid=(L+R)>>1;
	if(l<=mid)add(l,r,L,mid,ls(fa));
	if(r>mid)add(l,r,mid+1,R,rs(fa));
	return;
}
void dijkstra(){
	priority_queue<ll>q;
	memset(dis,0x3f,sizeof(dis));
	dis[a[s]+N]=0;
	q.push({a[s]+N,0});
	while(!q.empty()){
		ll tmp=q.top();
//		cout<<tmp.x<<' '<<tmp.w<<endl;
		q.pop();
		if(f[tmp.x])continue;
		f[tmp.x]=true;
		for(ll i:v[tmp.x]){
			if(dis[i.x]>dis[tmp.x]+i.w){
				dis[i.x]=dis[tmp.x]+i.w;
				q.push({i.x,dis[i.x]});
			}
		}
	}
}
int main(){
	cin>>n>>m>>s;
	build(1,n,1);
//	for(int i=1;i<=n;i++){
//		cout<<a[i]<<' ';
//	}
//	cout<<endl;
	for(int i=1;i<=m;i++){
		int l,r;
		cin>>op>>pos>>l>>r;
		if(op==1){
			v[a[pos]+N].push_back({a[l]+N,r});
		}else{
			cin>>w;
			add(l,r,1,n,1);
		}
	}
//	for(int i=1;i<=n*2;i++){
//		for(ll j:v[i]){
//			cout<<"{"<<j.x<<","<<j.w<<"} ";
//		}
//		cout<<endl;
//	}
//	for(int i=1;i<=n*2;i++){
//		for(ll j:v[i+N]){
//			cout<<"{"<<j.x<<","<<j.w<<"} ";
//		}
//		cout<<endl;
//	}
	dijkstra();
	for(int i=1;i<=n;i++){
		if(dis[a[i]]>1e9)cout<<-1<<' ';
		else cout<<dis[a[i]]<<' ';
	}
	cout<<endl;
	return 0;
}

2025/7/25 17:15
加载中...