splay模板
来源:互联网 发布:苹果5s2g网络怎么改4g 编辑:程序博客网 时间:2024/05/26 09:57
#define fa(i) (T[i].p)#define L(i) (T[i].s[0])#define R(i) (T[i].s[1])#define Key (L(R(root)))#define Loc(i) (T[fa(i)].s[1]==i)#define Sets(a,b,c) {if(a)T[a].s[c]=b;if(b)fa(b)=a;}using namespace std;const int N=101000,INF=0x3f3f3f3f;void read(int &x){x=0;char c=getchar();int f=0;while(c<'0'||c>'9'){c=getchar();if(c=='-')f=1;}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}if(f)x=-x;}int A[N];struct node{int s[2],v,size,mark,Min,rev,p;};struct splay_tree{ node T[N<<1]; int root,tot,n,m; inline void update(int u){ T[u].size=T[L(u)].size+T[R(u)].size+1; T[u].Min=min(T[L(u)].Min,T[R(u)].Min); T[u].Min=min(T[u].v,T[u].Min); } void Build(int l,int r,int p,int &i){ if(l>r)return ; int Mid=(l+r)>>1; T[i=++tot].p=p,T[i].v=A[Mid],T[i].Min=A[Mid],T[i].size=1; Build(l,Mid-1,i,L(i)),Build(Mid+1,r,i,R(i)); update(i); } inline void Rotate(int x){ int y=fa(x),z=fa(y); int lx=Loc(x),ly=Loc(y); Sets(y,T[x].s[!lx],lx); Sets(z,x,ly); Sets(x,y,!lx); update(y); } inline void splay(int i,int goal){while(fa(i)!=goal){if (fa(fa(i))!=goal)Rotate(fa(i));Rotate(i);}update(i);if (!goal)root=i;} inline void pushdown(int i){ if (T[i].mark){ int D=T[i].mark; if(L(i)){T[L(i)].mark+=D,T[L(i)].v+=D,T[L(i)].Min+=D;} if(R(i)){T[R(i)].mark+=D,T[R(i)].v+=D,T[R(i)].Min+=D;} T[i].mark=0; } if(T[i].rev){ if(L(i))T[L(i)].rev^=1; if(R(i))T[R(i)].rev^=1; T[i].rev=0; swap(L(i),R(i)); } } int Rank(int kth,int i){ pushdown(i); if (T[L(i)].size+1==kth)return i; else if (T[L(i)].size>=kth)return Rank(kth,L(i)); else return Rank(kth-T[L(i)].size-1,R(i)); } void init(){ read(n); T[0].Min=T[0].v=A[0]=A[n+1]=INF; For(i,1,n)read(A[i]); Build(0,n+1,0,root); T[Rank(n+2,root)].Min=INF; read(m);}inline void find(int x,int y){splay(Rank(x,root),0);splay(Rank(y+2,root),root);}inline int Mina(int x,int y){find(x,y);return T[Key].Min;}inline void add(int x,int y,int D){find(x,y);T[Key].mark+=D,T[Key].Min+=D,T[Key].v+=D;update(R(root)),update(root);}inline void insert(int x,int y){find(x+1,x);Key=++tot;T[Key].v=T[Key].Min=y;T[Key].size=1,T[Key].p=R(root);}inline void del(int x){find(x,x);T[Key].p=0,Key=0;update(R(root)),update(root);}inline void reverse(int x,int y){find(x,y),T[Key].rev^=1;}inline void revolve(int x,int y,int D){int Mod=(y-x+1);((D%=Mod)+=Mod)%=Mod;find(y-D+1,y);int tk=Key;Key=0;update(R(root)),update(root);find(x,x-1);Sets(R(root),tk,0);update(R(root)),update(root);}}s;
0 0
- SPLAY模板
- (模板)splay
- splay模板
- splay 模板
- splay 模板
- 【模板】splay
- splay模板
- splay模板
- Splay模板
- Splay模板
- splay 模板
- Splay模板
- 【模板】Splay
- splay模板
- Splay模板
- Splay模板
- Splay模板
- 【Splay模板】
- Words 2016.12.11
- 全排列算法
- Oracle代码大全
- 定长顺序串的kmp算法
- ARM第十二天(中断处理)
- splay模板
- 5-4 List Leaves (25分)
- CUDA template kernel 与其他编译器合作编译
- Navigate()函数的URL参数可以设置为相对路径吗?
- 201412-1 试题名称:门禁系统(100分)ccf认证
- mysql查询语句
- JAVA输入输出流
- Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
- 在java中用dom4j解析xml