WA on #4 求调
  • 板块CF786B Legacy
  • 楼主_Ch1F4N_
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/4 17:22
  • 上次更新2023/11/2 22:45:52
查看原帖
WA on #4 求调
520748
_Ch1F4N_楼主2023/9/4 17:22

如题,代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e5+114;
const int inf = 1e18+7;
vector< pair<int,int> > edge[maxn*40];
int tr[maxn<<2][2];
int tot,n,m;
void build(int cur,int lt,int rt){
    tr[cur][0]=++tot;
    tr[cur][1]=++tot;
    if(lt==rt){
        edge[tr[cur][0]].push_back(make_pair(lt,0));
        edge[lt].push_back(make_pair(tr[cur][1],0));
        return ;
    }
    int mid=(lt+rt)>>1;
    build(cur<<1,lt,mid);
    build(cur<<1|1,mid+1,rt);
    edge[tr[cur][0]].push_back(make_pair(tr[cur<<1][0],0));
    edge[tr[cur][0]].push_back(make_pair(tr[cur<<1|1][0],0));
    edge[tr[cur<<1][1]].push_back(make_pair(tr[cur][1],0));
    edge[tr[cur<<1|1][1]].push_back(make_pair(tr[cur][1],0));
    return ;
}
void update1(int cur,int lt,int rt,int l,int r,int x,int w){
    if(l<=lt&&rt<=r){
        edge[x].push_back(make_pair(tr[cur][0],w));
        return ;
    }
    if(rt<l||lt>r) return ;
    int mid=(lt+rt)>>1;
    update1(cur<<1,lt,mid,l,r,x,w);
    update1(cur<<1|1,mid+1,rt,l,r,x,w);
}
void update2(int cur,int lt,int rt,int l,int r,int x,int w){
    if(l<=lt&&rt<=r){
        edge[tr[cur][1]].push_back(make_pair(x,w));
        return ;
    }
    if(rt<l||lt>r) return ;
    int mid=(lt+rt)>>1;
    update2(cur<<1,lt,mid,l,r,x,w);
    update2(cur<<1|1,mid+1,rt,l,r,x,w);
}
priority_queue< pair<int,int> ,vector< pair<int,int> >,less< pair<int,int> > > q;
int vis[maxn],dis[maxn],s;
void dij(){
    for(int i=1;i<=tot;i++) dis[i]=inf;
    dis[s]=0;
    q.push(make_pair(dis[s],s));
    while(q.size()>0){
        pair<int,int> u=q.top();
        q.pop();
        if(vis[u.second]==true) continue;
        vis[u.second]=true;
        for(pair<int,int> v:edge[u.second]){
            if(dis[v.first]>dis[u.second]+v.second){
                dis[v.first]=dis[u.second]+v.second;
                q.push(make_pair(dis[v.first],v.first));
            }
        }
    }
}
signed main(){
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++) tot++;
    build(1,1,n);
    while(m--){
        int opt;
        cin>>opt;
        if(opt==1){
            int u,v,w;
            cin>>u>>v;
            edge[u].push_back(make_pair(v,w));
        }
        else if(opt==2){
            int u,l,r,w;
            cin>>u>>l>>r>>w;
            update1(1,1,n,l,r,u,w);
        }
        else{            
            int u,l,r,w;
            cin>>u>>l>>r>>w;
            update2(1,1,n,l,r,u,w);   
        }
    }
    dij();
    for(int i=1;i<=n;i++) cout<<(dis[i]==inf?-1:dis[i])<<' ';
}
2023/9/4 17:22
加载中...