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;
}