社区讨论
蒟蒻刚学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 条回复,欢迎继续交流。
正在加载回复...