求大佬看看这两份代码区别,一个79分 一个93分
查看原帖
求大佬看看这两份代码区别,一个79分 一个93分
246331
mystic_qwq楼主2024/4/9 11:54

RT,蒟蒻就是修改了一下语法,怎么低这么多分,awsl

154997812 154996754

#include<bits/stdc++.h>
using namespace std;
using pii=pair<int,int>;
using tiiib=tuple<int,int,int,bool>;
const int N=1e5+1;
vector<pii>G[N];
#define pb push_back
vector<tiiib>e1;
int n,m;
long ans;
void kruskal(){
  static int fa[N];
  for(int i=1;i<=n;++i) fa[i]=i;
  function<int(int)>find=[&](int x){
    return x==fa[x]?x:fa[x]=find(fa[x]);
  };
  #define add(u,v,w) G[u].pb({v,w}),G[v].pb({u,w})
  sort(e1.begin(),e1.end());
  for(auto&[w,u,v,used]:e1){
    int fu=find(u),fv=find(v);
    if(fu!=fv) ans+=w,add(u,v,w),used=1,fa[fv]=fu;
  }
}
const int L=log2(N-1)+1;
int f[N][L],mx[N][L],mx2[N][L],dep[N];
#define _(x) x[u][i]
#define Ls(x) x[u][i-1]
#define Rs(x) x[f[u][i-1]][i-1]
void dfs(int u){
  dep[u]=dep[*f[u]]+1;
  for(int i=1;(1<<i)<=n;++i){
    _(f)=Rs(f);
    if(Ls(mx)==Rs(mx)) _(mx)=Ls(mx),_(mx2)=max(Ls(mx2),Rs(mx2));
    else if(Ls(mx)<Rs(mx)) _(mx)=Rs(mx),_(mx2)=max(Ls(mx),Rs(mx2));
    else _(mx)=Ls(mx),_(mx2)=max(Ls(mx2),Rs(mx));
  }
  for(auto[v,w]:G[u])
    if(v!=*f[u]) *f[v]=u,*mx[v]=w,dfs(v);
}
const long inf=0x7fffffffffffffff;
long cal(int u,int v,int w){
#define irep for(int i=log2(n);~i;--i)
  auto LCA=[&](int u,int v){
    if(dep[u]<dep[v]) swap(u,v);
    for(int x=dep[u]-dep[v],n;x;)
        n=log2(x),u=f[u][n],x^=1<<n;
    if(u==v) return v;
    irep if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
    return *f[u];
  };
  int l=LCA(u,v),nmx=0,nmx2=0;
  #define opt(u)\
    if(dep[_(f)]>=dep[l]){\
      if(nmx==_(mx)) nmx2=max(_(mx2),nmx2);\
      else if(nmx>_(mx)) nmx2=max(_(mx),nmx2);\
      else nmx2=max(_(mx2),nmx),nmx=_(mx);\
      u=f[u][i];\
    }
  irep {opt(u) opt(v)}
  if(w!=nmx) return ans-nmx+w;
  if(nmx2) return ans-nmx2+w;
  return inf;
}
#undef opt
#undef add
#undef irep
#undef pb
#undef _
#undef Ls
#undef Rs
main(){
  cin.tie(0)->sync_with_stdio(0);
  cin>>n>>m,e1.resize(m);
  for(auto&[w,u,v,used]:e1)
    cin>>u>>v>>w,used=0;
  kruskal(),dfs(1);
  long ans=inf;
  for(auto[w,u,v,used]:e1)
    if(!used) ans=min(cal(u,v,w),ans);
  cout<<ans;
}

#include<bits/stdc++.h>
using namespace std;
using pii=pair<int,int>;
using tiiib=tuple<int,int,int,bool>;
const int N=1e5+1;
vector<pii>G[N];
#define pb push_back
void add(int u,int v,int w){
  G[u].pb({v,w}),G[v].pb({u,w});
}
vector<tiiib>e1;
int fa[N];
int find(int x){
  return x==fa[x]?x:fa[x]=find(fa[x]);
}
long ans;
void kruskal(){
  sort(e1.begin(),e1.end());
  for(auto&[w,u,v,used]:e1){
    int fu=find(u),fv=find(v);
    if(fu!=fv) ans+=w,add(u,v,w),used=1,fa[fv]=fu;
  }
}
const int L=log2(N-1)+1;
int n,m,f[N][L],mx[N][L],mx2[N][L],dep[N];
/*inline void Ls(int(*Max)[L],int u,int i){
  return Max[u][i-1];
}
inline void Rs(int(*Max)[L],int u,int i){
  return Max[f[u][i-1]][i-1];
}*/
#define _(x) x[u][i]
#define Ls(x) x[u][i-1]
#define Rs(x) x[f[u][i-1]][i-1]
void dfs(int u){
  dep[u]=dep[*f[u]]+1;
  for(int i=1;(1<<i)<=n;++i){
    _(f)=Rs(f);
    if(Ls(mx)==Rs(mx)) _(mx)=Ls(mx),_(mx2)=max(Ls(mx2),Rs(mx2));
    else if(Ls(mx)<Rs(mx)) _(mx)=Rs(mx),_(mx2)=max(Ls(mx),Rs(mx2));
    else _(mx)=Ls(mx),_(mx2)=max(Ls(mx2),Rs(mx));
  }
  for(auto[v,w]:G[u])
    if(v!=*f[u]) *f[v]=u,*mx[v]=w,dfs(v);
}
#define irep for(int i=log2(n);~i;--i)
int LCA(int u,int v){
  if(dep[u]<dep[v]) swap(u,v);
  for(int x=dep[u]-dep[v],n;x;x-=1<<n)
    n=log2(x),u=f[u][n];
  if(u==v) return v;
  irep if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
  return *f[u];
}
const long inf=0x7fffffffffffffff;
long cal(int u,int v,int w){
  int l=LCA(u,v),nmx=0,nmx2=0;
  function<void(int&,int)> opt=[&](int&u,int i){
    if(dep[_(f)]>=dep[l]){
      if(nmx==_(mx)) nmx2=max(_(mx2),nmx2);
      else if(nmx>_(mx)) nmx2=max(_(mx),nmx2);
      else nmx2=max(_(mx2),nmx),nmx=_(mx);
      u=f[u][i];
    }
  };
  irep opt(u,i),opt(v,i);
  if(w!=nmx) return ans-nmx+w;
  if(nmx2) return ans-nmx2+w;
  return inf;
}
main(){
  cin.tie(0)->sync_with_stdio(0);
  cin>>n>>m,e1.resize(m);
  for(auto&[w,u,v,used]:e1)
    cin>>u>>v>>w,used=0;
  for(int i=1;i<=n;++i) fa[i]=i;
  kruskal(),dfs(1);
  long ans=inf;
  for(auto[w,u,v,used]:e1)
    if(!used) ans=min(cal(u,v,w),ans);
  cout<<ans;
}
2024/4/9 11:54
加载中...