没见过这么玄学的东西
查看原帖
没见过这么玄学的东西
307143
一铭君一楼主2021/9/9 10:39

rt,最后 4 个大数据 AC 了。然后前面听取 WA 声一片。

已经判断自环了。

int n,m;
struct edge{
  int intre,u,v,z;
  inline bool operator < (const edge b){
    return z<b.z;
  }
}e[maxn];

struct LCT{
  int ise,u,v,z,mu,mv,mz,tag;
  LCT *fa,*son[2];
}*null,*ptr[maxn+50005],node[maxn+50005];

inline bool notroot(LCT *x){ return x->fa->son[0]==x || x->fa->son[1]==x; }
inline void update(LCT *x){
  x->mz=inf;
  if(x->son[0]->mz<x->mz) x->mz=x->son[0]->mz,x->mu=x->son[0]->mu,x->mv=x->son[0]->mv;
  if(x->son[1]->mz<x->mz) x->mz=x->son[1]->mz,x->mu=x->son[1]->mu,x->mv=x->son[1]->mv;
  if(x->ise && x->z<x->mz) x->mz=x->z,x->mu=x->u,x->mv=x->v;
}
inline void Rev(LCT *x){ std::swap(x->son[0],x->son[1]),x->tag^=1; }
inline void push_down(LCT *x){
  if(x->tag){
    if(x->son[0]!=null) Rev(x->son[0]);
    if(x->son[1]!=null) Rev(x->son[1]);
    x->tag=0;
  }
}
inline bool get_which(LCT *x){ return x->fa->son[1]==x; }
void rotate(LCT *x){
  LCT *y=x->fa,*z=y->fa;
  int k=get_which(x);
  LCT *w=x->son[!k];
  if(notroot(y)) z->son[get_which(y)]=x; x->son[!k]=y,y->son[k]=w;
  if(w!=null) w->fa=y; y->fa=x,x->fa=z;
  update(y),update(x);
}
void splay(LCT *x){
  LCT *now=x;
  std::stack<LCT*>st;
  st.push(now);
  while(notroot(now)) st.push(now=now->fa);
  while(st.size()) push_down(st.top()),st.pop();
  while(notroot(x)){
    LCT *y=x->fa,*z=y->fa;
    if(notroot(y)) rotate(get_which(x)^get_which(y)?x:y);
    rotate(x);
  }
  update(x);
}
inline void access(LCT *x){
  LCT *y=null;
  while(x!=null){
    splay(x);
    x->son[1]=y;
    update(x);
    y=x,x=x->fa;
  }
}
inline LCT* findroot(LCT *x){
  access(x),splay(x);
  while(x->son[0]!=null)
    push_down(x),x=x->son[0];
  splay(x);
  return x;
}
inline void makeroot(LCT *x){ access(x),splay(x),Rev(x); }
inline void split(LCT *x,LCT *y){ makeroot(x),access(y),splay(y); }
inline void Link(LCT *x,LCT *y){ makeroot(x);if(findroot(y)!=x) x->fa=y; }
inline void Cut(LCT *x,LCT *y){
  makeroot(x);
  if(findroot(y)==x && y->fa==x && y->son[0]==null){
    y->fa=x->son[1]=null,update(x);
    // puts("I did it.");
  }
    
}

/*
struct LCT{
  int ise,u,v,z,mu,mv,mz,tag;
  LCT *fa,*son[2];
}*null,*ptr[5005],node[5005];
*/
int cnt,minit,ans=inf;
bool vis[maxn];
std::map< std::pair<int,int>,int >map;

signed main(){
  // freopen("simpleinput.txt","r",stdin);
  node[maxn+50004]=(LCT){0,0,0,inf,0,0,inf,0,NULL,NULL,NULL};
  null=&node[maxn+50004];
  read(n),read(m);
  for(int i=1;i<=n;++i){
    node[i]=(LCT){0,0,0,inf,0,0,inf,0,null,null,null};
    ptr[i]=&node[i];
  }
  for(int i=1;i<=m;++i){
    read(e[i].u),read(e[i].v),read(e[i].z);
    if(e[i].u==e[i].v) i--,m--;
  }
  // write(m);
  int it=n;
  std::sort(e+1,e+m+1);
  for(int i=1;i<=m;++i){
    ++it;
    map[std::make_pair(e[i].u,e[i].v)]=i;
    map[std::make_pair(e[i].v,e[i].u)]=i;
    node[it]=(LCT){1,e[i].u,e[i].v,e[i].z,e[i].u,e[i].v,e[i].z,0,null,null,null};
    ptr[it]=&node[it];
  }
  for(int i=1;i<=m;++i){
    int u=e[i].u,v=e[i].v;
    if(findroot(ptr[u])!=findroot(ptr[v])){
      Link(ptr[u],ptr[n+i]);
      Link(ptr[n+i],ptr[v]);
      cnt++,vis[i]=1;
    }else{
      split(ptr[u],ptr[v]);
      int u1=ptr[v]->mu,v1=ptr[v]->mv,a1=map[std::make_pair(u1,v1)];
      Cut(ptr[u1],ptr[n+a1]),Cut(ptr[n+a1],ptr[v1]);
      Link(ptr[u],ptr[n+i]),Link(ptr[n+i],ptr[v]);
      vis[a1]=0,vis[i]=1;
    }
    if(cnt==n-1){
      while(!vis[minit]) ++minit;
      ans=std::min(ans,e[i].z-e[minit].z);
    }
  }
  write(ans),putchar('\n');
  return 0;
}
2021/9/9 10:39
加载中...