萌新刚学线段树优化建图,没过样例,求助
查看原帖
萌新刚学线段树优化建图,没过样例,求助
251723
Schwarzkopf_Henkal楼主2021/1/2 16:22

反复看了好多遍也没看出是哪里错了,求助,第一个样例过了,第二个没过。

#include<bits/stdc++.h>
using namespace std;
long long n,m,s,tot,R1,R2,dis[1000005],vis[1000005];
vector<pair<long long,long long> >to[1000005];
struct Seg{
    int ls,rs;
    #define ls(o) c[o].ls
    #define rs(o) c[o].rs
    #define mid ((l+r)/2)
}c[1000005];
priority_queue<pair<long long,long long>,vector<pair<long long,long long> >,greater<pair<long long,long long> > >que;
void Forward(int o,int l,int r,int v,int L,int R,long long w){
    if(l>=L&&r<=R){
        to[v].push_back(make_pair(o,w));
        return;
    }
    if(L<=mid){
        if(ls(o)==0){
            ls(o)=++tot;
            to[o].push_back(make_pair(ls(o),0));
            if(l>=mid)
                to[ls(o)].push_back(make_pair(l,0));
        }
        Forward(ls(o),l,mid,v,L,R,w);
    }
    if(R>mid){
        if(rs(o)==0){
            rs(o)=++tot;
            to[o].push_back(make_pair(rs(o),0));
            if(mid+1>=r)
                to[rs(o)].push_back(make_pair(r,0));
        }
        Forward(rs(o),mid+1,r,v,L,R,w);
    }
}
void Backward(int o,int l,int r,int v,int L,int R,long long w){
    if(l>=L&&r<=R){
        to[o].push_back(make_pair(v,w));
        return;
    }
    if(L<=mid){
        if(ls(o)==0){
            ls(o)=++tot;
            to[ls(o)].push_back(make_pair(o,0));
            if(l>=mid)
                to[l].push_back(make_pair(ls(o),0));
        }
        Backward(ls(o),l,mid,v,L,R,w);
    }
    if(R>mid){
        if(rs(o)==0){
            rs(o)=++tot;
            to[rs(o)].push_back(make_pair(o,0));
            if(mid+1>=r)
                to[r].push_back(make_pair(rs(o),0));
        }
        Backward(rs(o),mid+1,r,v,L,R,w);
    }
}
int main(){
    scanf("%lld%lld%lld",&n,&m,&s);
    tot=n;
    for(int i=1,typ,s,u,v,w;i<=m;i++){
        scanf("%d",&typ);
        if(typ==1){
            scanf("%d%d%d",&u,&v,&w);
            to[u].push_back(make_pair(v,w));
        }
        if(typ==2){
            scanf("%d%d%d%d",&s,&u,&v,&w);
            if(R1==0)
                R1=++tot;
            Forward(R1,1,n,s,u,v,w);
        }
        if(typ==3){
            scanf("%d%d%d%d",&s,&u,&v,&w);
            if(R2==0)
                R2=++tot;
            Backward(R2,1,n,s,u,v,w);
        }
    }
    memset(dis,6,sizeof(dis));
    dis[s]=0;
    que.push(make_pair(0,s));
    while(!que.empty()){
        while(!que.empty()&&vis[que.top().second])
            que.pop();
        if(que.empty())
            break;
        long long cur=que.top().second;
        vis[cur]=1;
        for(int i=0;i<to[cur].size();i++)
            if(!vis[to[cur][i].first]&&dis[to[cur][i].first]>dis[cur]+to[cur][i].second){
                dis[to[cur][i].first]=dis[cur]+to[cur][i].second;
                que.push(make_pair(dis[to[cur][i].first],to[cur][i].first));
            }
    }
    for(int i=1;i<=n;i++){
        if(dis[i]>=1e16)
            printf("-1 ");
        else printf("%lld ",dis[i]);
    }
}/*

*/
2021/1/2 16:22
加载中...