HNOI 2012 영원히 고향 이 없다
splay 계발 식 통합 템 플 릿, 작은 splay 는 큰 splay 에 꽂 고 감성 적 인 이해, 한 점 은 최대 logn 회, logn, n 점, nlognlogn 을 꽂 습 니 다 ~
#include
using namespace std;
#define Inc(i,L,r) for(register int i=(L);i<=(r);++i)
const int N = 2e5+10;
int n,m,a[N];
int fa[N],rt[N];
inline int getfa(int x){//
return x^fa[x]?fa[x]=getfa(fa[x]):x;
}
struct Splay{
int p[N],ch[N][2];
int cnt,vl[N],idx[N],siz[N];
#define Ls(x) ch[x][0]
#define rs(x) ch[x][1]
#define maintain(x) siz[x]=siz[Ls(x)]+siz[rs(x)]+1
inline void rotate(int x){
int f=p[x],gf=p[f],tp=rs(f)==x,son=ch[x][!tp];
ch[p[son]=f][tp]=son,maintain(f);
ch[p[f]=x][!tp]=f,maintain(x);
ch[p[x]=gf][rs(gf)==f]=x;
}
inline void splay(int x,int goal,int &root){
if(x==goal)return ;
while(p[x]^goal){
if((p[p[x]]^goal)&&((rs(p[p[x]])==p[x])==(rs(p[x])==x)))rotate(p[x]);
rotate(x);
}
if(!goal)root=x;
}
inline void newnode(int x,int k,int Fa,int Idx){
idx[x]=Idx,siz[x]=1,vl[x]=k,p[x]=Fa;
}
inline void insert(int &x,int k,int Fa,int Idx,int &root){
if(!x)return newnode(x=++cnt,k,Fa,Idx),splay(x,0,root),void();
insert(ch[x][vl[x]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.