优化建图求调
  • 板块CF786B Legacy
  • 楼主TKXZ133
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/2 13:32
  • 上次更新2023/10/23 23:21:46
查看原帖
优化建图求调
767096
TKXZ133楼主2023/3/2 13:32

rt,一直 T 第八个点。

是哪里写假了吗(

#include <bits/stdc++.h>
using namespace std;
const int N=200100,M=3000100,D=800100;
typedef long long ll;
#define inf 0x3f3f3f3f3f3f3f3f

int to[M],nxt[M],head[M];
int idx=1,n,m,s,in1,in2,in3,in4,in5;
int id[M];ll dis[M],w[M];
struct node{int x;ll dis;};
bool operator < (node a,node b){return a.dis<b.dis;}
priority_queue <node> q;

void add(int u,int v,int c){idx++;to[idx]=v;nxt[idx]=head[u];head[u]=idx;w[idx]=c;}

struct STn{int l,r;};
struct ST{
    STn a[N<<2];
    void build(int p,int l,int r){
        a[p].l=l;a[p].r=r;
        if(a[p].l==a[p].r){id[a[p].l]=p;return ;}
        add(p,(p<<1),0);add(p,(p<<1|1),0);
        add((p<<1)+D,p+D,0);add((p<<1|1)+D,p+D,0);
        int mid=(a[p].l+a[p].r)>>1;
        build(p<<1,l,mid);build(p<<1|1,mid+1,r);
    }
    void connect(int p,int l,int r,int v,int c,int f){
        if(l<=a[p].l&&a[p].r<=r){if(f) add(v,p,c);else add(p+D,v+D,c);return ;}
        int mid=(a[p].l+a[p].r)>>1;
        if(l<=mid) connect(p<<1,l,r,v,c,f);
        if(r>mid) connect(p<<1|1,l,r,v,c,f);
    }
}tree;

void Dijkstra(){
    memset(dis,0x3f,sizeof dis);
    q.push(node{id[s]+D,0});dis[id[s]+D]=0;
    while(!q.empty()){
        node now=q.top();q.pop();
        if(dis[now.x]<now.dis) continue;
        for(int i=head[now.x];i;i=nxt[i]){
            int v=to[i];
            if(dis[v]<=dis[now.x]+w[i]) continue;
            dis[v]=dis[now.x]+w[i];
            q.push(node{v,dis[v]});
        }
    }
}

int main(){
    // freopen("the.in","r",stdin);
    // freopen("the.out","w",stdout);
    scanf("%d%d%d",&n,&m,&s);
    tree.build(1,1,n);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d%d",&in1,&in2,&in3,&in4);
        if(in1==1) add(id[in2],id[in3],in4);
        else scanf("%d",&in5),tree.connect(1,in3,in4,id[in2],in5,(in1==2)?1:0);
    }
    for(int i=1;i<=n;i++) add(id[i],id[i]+D,0),add(id[i]+D,id[i],0);
    Dijkstra();
    for(int i=1;i<=n;i++){
        if(dis[id[i]]==inf) cout<<"-1 ";
        else cout<<dis[id[i]]<<' ';
    }
    return 0;
}
2023/3/2 13:32
加载中...