萌新求助线段树优化建图版子

P6348 [PA2011] Journeys

int_Hello_world @ 2023-04-08 17:38:58

萌新刚学线段树优化建图,样例都没过。 代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {                   
    int x=0,f=0;char ch=getchar();                   
    for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');             
    for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);   
    return f?-x:x;        
}                      
void print(int x) {          
    if(x<0) putchar('-'),x=-x;       
    if(x>9) print(x/10);           
    putchar(x%10+48);               
}    
int x,y,z,s,n,m,cnt,head[1231311],dis[1023131],tot;
bool vis[1023131];
int in_root,out_root,in_num[1231311],out_num[1023131];
struct node{
    int next,to,w;
}e[1023131];
void add(int u,int v,int w){
    e[++cnt].next=head[u];
    e[cnt].to=v;
    e[cnt].w=w;
    head[u]=cnt;
}
namespace ss{
    #define lson tree[pos].ls
    #define rson tree[pos].rs
    struct sss{
        int sum,ls,rs;
    }tree[1201231];
    void build(int &pos,int l,int r) {
        pos=++tot;
        if (l==r) {
            in_num[l]=pos;
            return ;
        }
        int mid=l+r>>1;
        build(lson,l,mid); build(rson,mid+1,r);
        add(lson,pos,0); add(rson,pos,0);
    }
    void update(int pos,int l,int r,int L,int R,int k,int val) {
        if (l>=L && r<=R) {
            add(pos,k,val);
            return ;
        }
        int mid=l+r>>1;
        if (L<=mid) update(lson,l,mid,L,R,k,val);
        if (R>mid) update(rson,mid+1,r,L,R,k,val);
    }
}
namespace ss2{
    #define lson tree[pos].ls
    #define rson tree[pos].rs
    struct sss{
        int sum,ls,rs;
    }tree[1201231];
    void build(int &pos,int l,int r) {
        pos=++tot;
        if (l==r) {
            out_num[l]=pos;
            return ;
        }
        int mid=l+r>>1;
        build(lson,l,mid); build(rson,mid+1,r);
        add(pos,lson,0); add(pos,rson,0);
    }
    void update(int pos,int l,int r,int L,int R,int k,int val) {
        if (l>=L && r<=R) {
            add(k,pos,val);
            return ;
        }
        int mid=l+r>>1;
        if (L<=mid) update(lson,l,mid,L,R,k,val);
        if (R>mid) update(rson,mid+1,r,L,R,k,val);
    }   
}
void dj(){
    s=in_num[s];
    memset(dis,0x3f,sizeof(dis));
    priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > >q;
    q.push(make_pair(0,s));
    dis[s]=0;
    while(!q.empty()) {
        int now=q.top().second; q.pop();
        if (vis[now]) continue;
        vis[now]=1;
        for (int i=head[now];i;i=e[i].next) {
            if (dis[e[i].to]>dis[now]+e[i].w) {
                dis[e[i].to]=dis[now]+e[i].w;
                q.push(make_pair(dis[e[i].to],e[i].to));
            }
        }
    }
} 
signed main(){
    n=read(); m=read(); s=read();
    ss::build(in_root,1,n);
    ss2::build(out_root,1,n);
    for (int i=1;i<=n;++i) {
        add(in_num[i],out_num[i],0); add(out_num[i],in_num[i],0);
    }   
    for (int i=1;i<=m;++i) {
        int x=read(),y=read(),l=read(),r=read(),a=++tot,b=++tot;
        add(a,b,1);
        ss::update(in_root,1,n,x,y,a,0);
        ss2::update(out_root,1,n,l,y,b,0);
        a=++tot,b=++tot;
        add(a,b,1);
        ss::update(in_root,1,n,l,r,a,0);
        ss2::update(out_root,1,n,x,y,b,0);
    }
    dj();
    for (int i=1;i<=n;++i) {
        cout<<dis[out_num[i]]<<"\n";
    }
    return 0;
}

|