萌新 WA ON TEST 5求助
查看原帖
萌新 WA ON TEST 5求助
414386
Isshiki·Iroha楼主2023/7/18 11:53
const int maxn=1e5+10;
const int maxN=1e6+10;
const int M=5e5;
const int maxm=maxn<<2;
#define PIL pair<int,ll>
#define mkp make_pair
#define ls (u<<1)
#define rs (u<<1|1)
int n,m,s;
vector< PIL >tp[maxN];
int Idin[maxn];
void build(int u,int l,int r){
	if(l==r){
		Idin[l]=u;
		return;
	}
	tp[u].emplace_back(mkp(ls,0));
	tp[u].emplace_back(mkp(rs,0));
	tp[ls+M].emplace_back(mkp(u+M,0));
	tp[rs+M].emplace_back(mkp(u+M,0));
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
}
void modify1(int u,int l,int r,int x,int y,ll w,int p){//In-Tree <- point + M
	if(y<l||r<x)return;
	if(l>=x&&r<=y){
		tp[p].emplace_back(mkp(u,w));
		return;
	}
	int mid=l+r>>1;
	if(mid>=x)modify1(ls,l,mid,x,y,w,p);
	if(mid<y)modify1(rs,mid+1,r,x,y,w,p);
}
void modify2(int u,int l,int r,int x,int y,ll w,int p){//Out-Tree -> point 
	if(y<l||r<x)return;
	if(l>=x&&r<=y){
		tp[u+M].emplace_back(mkp(p,w));
		return;
	}
	int mid=l+r>>1;
	if(mid>=x)modify2(ls,l,mid,x,y,w,p);
	if(mid<y)modify2(rs,mid+1,r,x,y,w,p);
}
ll dis[maxN];bool vis[maxN];
bool operator <(const PIL A,const PIL B){
	return A.second>B.second;
}
priority_queue< PIL ,vector< PIL >,greater<PIL> >q;
void Dijstra(int s){
	memset(dis,0x3f,sizeof dis);
	dis[s]=0;
	q.push(mkp(s,0));
	while(!q.empty()){
		PIL temp=q.top();
		q.pop();
		int u=temp.first;
		if(vis[u]==1)continue;
		vis[u]=1;
		for(auto T:tp[u]){
			int v=T.first;
			if(dis[v]>dis[u]+T.second){
				dis[v]=dis[u]+T.second;
				q.push(mkp(v,dis[v]));
			}
		}
	}
}
int main() {
    read(n,m,s);
    build(1,1,n);
    for(int i(1);i<=n;++i){
    	tp[Idin[i]].emplace_back(mkp(Idin[i]+M,0));
    	tp[Idin[i]+M].emplace_back(mkp(Idin[i],0));	
	}
    for(int i(1),op,u,l,r,w;i<=m;++i){
    	read(op);
    	if(op==1){
    		read(u,l,w);
    		tp[Idin[u]].emplace_back(mkp(Idin[l],w));
		}
		else if(op==2){
			read(u,l,r,w);
			modify1(1,1,n,l,r,w*1ll,Idin[u]+M);
		}
		else{
			read(u,l,r,w);
			modify2(1,1,n,l,r,w*1ll,Idin[u]);
		}
	}
	Dijstra(Idin[s]);
	for(int i(1);i<=n;++i){
		write(dis[Idin[i]+M]==0x3f3f3f3f3f3f3f3fll?-1:dis[Idin[i]+M]);
	}
    return 0;
}
2023/7/18 11:53
加载中...