线段树递归了10000000层?
查看原帖
线段树递归了10000000层?
399475
_XHY20180718_楼主2024/1/16 11:56

RT,这份代码到底怎么了?为何线段树会递归如此多层???

#include<bits/stdc++.h>
#define mid (l+(r-l>>1))
#define ls (mid<<1)
#define rs (ls|1)
using namespace std;
const int N=1e3+5,M=1e6+5,INF=1e9+9;
int n,m,q,L,R,K,id,D;
int cnt[N],head[N],fa[N],ei;
map<pair<int,int>,bool>mp;
struct Segment_Tree{
    int w=INF,fl=INF;
}tr[N<<1];
struct edge{
    int u,v,w,nxt;
}egs[M<<1];
inline void add(int u,int v,int w)
{egs[++ei]={u,v,w,head[u]};head[u]=ei;}
inline void chgn(int id,int x)
{tr[id].w=min(tr[id].w,x),tr[id].fl=min(tr[id].fl,x);}
inline void pushdown(int l,int r,int id)
{int x=tr[id].fl;if(x!=INF)chgn(ls,x),chgn(rs,x);}
inline void upd(int l,int r,int id){
    ++D;if(D>1000000)assert(0);
    if(L<=l&&r<=R){chgn(id,K);--D;return;}
    pushdown(l,r,id);
    if(L<=mid)upd(l,mid,ls);
    if(mid<R)upd(mid+1,r,rs);
    tr[id].w=max(tr[ls].w,tr[rs].w);
    --D;
}
struct Dijkstra{
    struct node{
        int u,w;
        bool operator<(const node &t)
        const{return w>t.w;}
    };
    priority_queue<node>qu;
    int dis[N],lst[N];
    bool vis[N];
    inline void solve(int s){
        for(int i=1; i<=n; ++i)dis[i]=INF;
        qu.push({s,0});dis[s]=0;
        while(!qu.empty()){
            int u=qu.top().u;qu.pop();
            if(vis[u])continue;vis[u]=1;
            for(int i=head[u];i;i=egs[i].nxt){
                const int v=egs[i].v,w=egs[i].w;
                if(dis[v]>dis[u]+w){
                    dis[v]=dis[u]+w,lst[v]=u;
                    qu.push({v,dis[v]});
                }
            }
        }
    }
}S,T;
inline int find(int x){
    while(x!=fa[x])
        x=fa[x]=fa[fa[x]];
    return x;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;int u,v,w;
    for(int i=1; i<=m; ++i)
        cin>>u>>v>>w,add(u,v,w),add(v,u,w);
    S.solve(1),T.solve(n);
    for(int u=1; u!=n; u=T.lst[u]){
        cnt[u]=++id;mp[{u,T.lst[u]}]=1;
    }cnt[n]=id+1;
    for(int i=1; i<=n; ++i)fa[i]=i;
    for(int i=1; i<=ei; i+=2){
        u=egs[i].u,v=egs[i].v,w=egs[i].w;
        if(mp[{u,v}])continue;
        int pu=find(u),pv=find(v);
        if(!cnt[pu]&&cnt[pv])fa[pu]=pv;
        else if(!cnt[pv])fa[pv]=pu;
        else{L=cnt[pu],R=cnt[pv];
            if(L>R)swap(L,R);--R;
            K=min(S.dis[u]+T.dis[v]+w,S.dis[v]+T.dis[u]+w);
            upd(1,id,1);
        }
    }
    cout<<tr[1].w<<'\n';
    return 0;
}

https://www.luogu.com.cn/record/143000449

2024/1/16 11:56
加载中...