fhq_tree模板 发表于 2019-10-05 | 阅读次数: 本文字数: 13k | 阅读时长 ≈ 12 分钟 直接上代码点击显/隐代码 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586#include<bits/stdc++.h>using namespace std;struct tree{ struct node { int val,siz,lson,rson; node(int v=0,int s=1,int l=0,int r=0):val(v),siz(s),lson(l),rson(r) {} }t[500005]; tree() {root=1,srand(time(0)),t[0].siz=0;} int root; inline char Rand(int a,int b) {return rand()%(a+b)<a;} inline void update(int x) {t[x].siz=t[t[x].lson].siz+t[t[x].rson].siz+1;} inline int new_node(int x) { static int tot=0; t[++tot]=node(x,1,0,0); return tot; } inline int lfind(int x) {return t[x].lson?lfind(t[x].lson):t[x].val;} inline int rfind(int x) {return t[x].rson?rfind(t[x].rson):t[x].val;} inline void sbyval(int x,int k,int &a,int &b) { if(x==0) a=b=0; else if(t[x].val<=k) a=x,sbyval(t[x].rson,k,t[a].rson,b),update(a); else b=x,sbyval(t[x].lson,k,a,t[b].lson),update(b); } inline void sbysiz(int x,int k,int &a,int &b) { if(x==0) a=b=0; else if(k<=t[t[x].lson].siz) b=x,sbysiz(t[x].lson,k,a,t[x].lson),update(x); else a=x,sbysiz(t[x].rson,k-t[t[x].lson].siz-1,t[x].rson,b),update(x); } inline int merge(int x,int y) { if(x==0||y==0) return x+y; if(x==y) return x; if(Rand(t[x].siz,t[y].siz)) return t[x].rson=merge(t[x].rson,y),update(x),x; return t[y].lson=merge(x,t[y].lson),update(y),y; } inline void ins(int k) { int r1=root,r2=root; sbyval(root,k,r1,r2); root=merge(merge(r1,new_node(k)),r2); } inline void del(int k) { int r1=root,r2=root,r3=root,r=root; sbyval(root,k,r,r3); sbyval(r,k-1,r1,r2); r2=merge(t[r2].lson,t[r2].rson); root=merge(merge(r1,r2),r3); } inline int rank(int k) { int r1=root,r2=root,ans; sbyval(root,k-1,r1,r2); ans=t[r1].siz,root=merge(r1,r2); return ans+1; } inline int data(int k) { int r1=root,r2=root,ans; sbysiz(root,k-1,r1,r2); ans=lfind(r2),root=merge(r1,r2); return ans; } inline int last(int k) { int r1=root,r2=root,ans; sbyval(root,k-1,r1,r2); ans=rfind(r1),root=merge(r1,r2); return ans; } inline int next(int k) { int r1=root,r2=root,ans; sbyval(root,k,r1,r2); ans=lfind(r2),root=merge(r1,r2); return ans; }};int main(){}