全是-1求调
  • 板块CF786B Legacy
  • 楼主mlvx
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/25 17:28
  • 上次更新2024/5/25 17:29:41
查看原帖
全是-1求调
1248522
mlvx楼主2024/5/25 17:28
#include<bits/stdc++.h>
using namespace std;
#define pl (p<<1)
#define pr (p<<1|1)
const int N=1e5+10,D=N<<2;
struct edge{int nxt,to,dis;}e[N*10];
struct node{int x,dis;};bool operator<(node x,node y){return x.dis>y.dis;}
int n,q,s,op,l,r,v,w,cnt,num[N],vis[N*10],dis[N*10],head[N*10];
void add(int a,int b,int c){++cnt,e[cnt].to=b,e[cnt].nxt=head[a],e[cnt].dis=c,head[a]=cnt;}
void build(int l,int r,int p){
	if(l==r)return void(num[l]=p);
	add(p,pl,0),add(p,pr,0),add(pl+D,p+D,0),add(pr+D,p+D,0);
	int mid=l+r>>1;
	build(l,mid,pl),build(mid+1,r,pr);
}void update(int l,int r,int le,int ri,int v,int w,int p){
	if(l>=le&&r<=ri){
		if(op==3)add(p+D,v,w);
		else add(v+D,p,w);
		return;
	}int mid=l+r>>1;
	if(le<=mid)update(l,mid,le,ri,v,w,pl);
	if(ri>mid)update(mid+1,r,le,ri,v,w,pr);
}void dij(int s){
    memset(dis,0x3f,sizeof dis),dis[s]=0;
    priority_queue<node>q;q.push({0,s});
    while(!q.empty()){
        node f=q.top();q.pop();int x=f.x;
        if(vis[x])continue;
        vis[x]=1;
        for(int i=head[x];i;i=e[i].nxt){
            int t=e[i].to;
            if(dis[t]>dis[x]+e[i].dis)dis[t]=dis[x]+e[i].dis,q.push({dis[t],t});
        }
    }
}int main(){
	cin>>n>>q>>s,build(1,n,1);
	for(int i=1,f;i<=n;i++)f=num[i],add(f,f+D,0),add(f+D,f,0);
	while(q--){
		cin>>op;
		if(op==1)cin>>l>>r>>w,add(num[l]+D,num[r],w);
		else cin>>v>>l>>r>>w,update(1,n,l,r,num[v],w,1);
	}dij(num[s]+D);
	for(int i=1;i<=n;i++)cout<<(dis[num[i]]==0x3f3f3f3f?-1:dis[num[i]])<<' ';
	return 0;
}
2024/5/25 17:28
加载中...