RT,树剖+st表,求助为啥WA80pts
#include<algorithm>
#include<cstdio>
#include<cassert>
typedef unsigned ui;
const int M=1e5+5;
struct Edge{
ui to,val,nx;
}e[M<<1];
unsigned long long V,sum,ans=-1;
struct edge{
ui u,v,val;bool vis;
inline bool operator<(const edge&E)const{
return val<E.val;
}
}E[M*3];
inline int max(const int&a,const int&b){
return a>b?a:b;
}
ui n,m,cnt,h[M],lg[M],val[M];
ui dfc,f[M],d[M],dfn[M],top[M],siz[M],son[M];
struct data{
ui mx,cmx;
data(const ui&mx=0,const ui&cmx=0):mx(mx),cmx(cmx){}
inline data operator+(const data&it)const{
if(mx==it.mx)return data(mx,max(cmx,it.cmx));
return mx>it.mx?data(mx,max(it.mx,cmx)):data(it.mx,max(mx,it.cmx));
}
}S[M],st[20][M];
struct DSU{
ui f[M],siz[M];
ui Find(const ui&u){
return f[u]==u?u:f[u]=Find(f[u]);
}
inline ui Link(ui u,ui v){
if((u=Find(u))==(v=Find(v)))return false;
return(siz[u]>siz[v]?siz[f[v]=u]+=siz[v]:siz[f[u]=v]+=siz[u]),true;
}
}Tree;
inline void MST(){
ui i,u,v,C(1);std::sort(E+1,E+m+1);
for(i=1;i<=n;++i)Tree.siz[Tree.f[i]=i]=1;
for(i=1;i<=m;++i){
if(Tree.Link(u=E[i].u,v=E[i].v)){
e[++cnt]=(Edge){v,E[i].val,h[u]};h[u]=cnt;
e[++cnt]=(Edge){u,E[i].val,h[v]};h[v]=cnt;
sum+=E[i].val;E[i].vis=true;if(++C==n)return;
}
}
}
void DFS1(const ui&u){
d[u]=d[f[u]]+1;siz[u]=1;
for(ui v,E=h[u];E;E=e[E].nx){
if((v=e[E].to)==f[u])continue;S[v]=e[E].val;f[v]=u;DFS1(v);
siz[u]+=siz[v];if(siz[v]>siz[son[u]])son[u]=v;
}
}
void DFS2(const ui&u,const ui&tp){
top[u]=tp;st[0][dfn[u]=++dfc]=S[u];if(u^tp)S[u]=S[u]+S[f[u]];if(!son[u])return;DFS2(son[u],tp);
for(ui E=h[u];E;E=e[E].nx)if(e[E].to^f[u]&&e[E].to^son[u])DFS2(e[E].to,e[E].to);
}
inline data Query(ui u,ui v){
data ans;ui k;
while(top[u]^top[v])d[top[u]]>d[top[v]]?(ans=ans+S[u],u=f[top[u]]):(ans=ans+S[v],v=f[top[v]]);
return u^v?((u=dfn[u])>(v=dfn[v])?u^=v^=u^=v:0),k=lg[v-++u+1],ans+st[k][u+(1<<k)-1]+st[k][v]:0;
}
signed main(){
ui i,j;data mx;scanf("%u%u",&n,&m);lg[0]=-1;
for(i=1;i<=n;++i)lg[i]=lg[i>>1]+1;
for(i=1;i<=m;++i)scanf("%u%u%u",&E[i].u,&E[i].v,&E[i].val);MST();DFS1(1);DFS2(1,1);
for(j=1;(1<<j)<=n;++j){
for(i=1<<j;i<=n;++i)st[j][i]=st[j-1][i]+st[j-1][i-(1<<j-1)];
}
for(i=1;i<=m;++i){
if(E[i].vis)continue;mx=Query(E[i].u,E[i].v);
mx.mx==E[i].val?(V=sum+E[i].val-mx.cmx)<ans?ans=V:0:(V=sum+E[i].val-mx.mx)<ans?ans=V:0;
}
printf("%llu",ans);
}