社区讨论

蒟蒻刚学OI,求助LCT WA 100

P4180[BJWC2010] 严格次小生成树参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo3bw6ht
此快照首次捕获于
2023/10/24 04:06
2 年前
此快照最后确认于
2023/10/24 04:06
2 年前
查看原帖
rt,hack数据为什么过不去啊啊(明明都没有被卡常
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)

const int N=5e5+10;

// Prime LCT

int ch[N][2],f[N],r[N],w[N],mx[N],mx2[N];
#define ls ch[x][0]
#define rs ch[x][1]
void pushup(int x){
    if(mx[ls]>mx[rs]){
        mx[x]=mx[ls],mx2[x]=max(mx2[ls],mx[rs]);
    }else if(mx[rs]>mx[ls]){
        mx[x]=mx[rs],mx2[x]=max(mx2[rs],mx[ls]);
    }else{
        mx[x]=mx[ls],mx2[x]=max(mx2[ls],mx2[rs]);
    }
    if(w[x]>mx[x]){
        mx2[x]=mx[x];mx[x]=w[x];
    }else if(w[x]!=mx[x]&&w[x]>mx2[x]){
        mx2[x]=w[x];
    }
}
void rev(int x){swap(ls,rs);r[x]^=1;}
void pushdown(int x){if(r[x]){if(ls)rev(ls);if(rs)rev(rs);r[x]=0;}}
int ident(int x){return ch[f[x]][1]==x;}
bool nrt(int x){return ch[f[x]][0]==x||ch[f[x]][1]==x;}
void con(int x,int y,int how){f[x]=y;ch[y][how]=x;}
void rot(int x){int y=f[x],z=f[y],xx=ident(x),yy=ident(y),son=ch[x][xx^1];f[x]=z;
if(nrt(y))con(x,z,yy);con(son,y,xx);con(y,x,xx^1);pushup(y);pushup(x);}
void upd(int x){if(nrt(x))upd(f[x]);pushdown(x);}
void splay(int x){upd(x);while(nrt(x)){int y=f[x];if(nrt(y))rot(ident(x)==ident(y)?y:x);rot(x);}}
int access(int x){int y=0;for(;x;y=x,x=f[x]){splay(x);ch[x][1]=y;pushup(x);}return y;}
void makert(int x){access(x);splay(x);rev(x);}
int findrt(int x){access(x);splay(x);while(ls)x=ls;splay(x);return x;}
void link(int x,int y){makert(x);f[x]=y;}
void cut(int x,int y){makert(x);access(y);splay(y);ch[y][0]=f[x]=0;pushup(y);}
void split(int x,int y){makert(x);access(y);splay(y);}

int n,m,fa[N];
int find(int x){
    return x==fa[x]?x:fa[x]=find(fa[x]);
}
struct edge{
    int u,v,w,id;
};

bool operator<(const edge& a,const edge& b){
    return a.w<b.w;
}
vector<edge> V,P;
int totot(int k){return n+k;}

int krus;
int minupp=INT_MAX-10;
signed main(){
    ios::sync_with_stdio(0);
    cin>>n>>m;
    rep(i,1,n)fa[i]=i;
    rep(i,1,m){
        int u,v,w;cin>>u>>v>>w;
        V.push_back({u,v,w,i});
    }
    sort(V.begin(),V.end());
    for(auto& i:V){
        if(find(i.u)!=find(i.v)){
            fa[find(i.u)]=find(i.v);
            w[totot(i.id)]=i.w;pushup(totot(i.id));
            link(i.u,totot(i.id));
            link(i.v,totot(i.id));
            krus+=i.w;
        }else{
            P.push_back(i);
        }
    }
    for(auto i:P){
        split(i.u,i.v);
        if(i.w==mx[i.v]){
            minupp=min(minupp,i.w-mx2[i.v]);
        }else{
            minupp=min(minupp,i.w-mx[i.v]);
        }
    }cout<<minupp+krus;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...