我今天有点开心啊!上午把数学结了,但是后两章的题码的比较少,函数那章只码了一道FFT,矩阵树定理也没码。下来两天可以专攻数据结构了。计划在数据结构搞完后留出2~3天总结,再把能码而没码的题都码了。然后就要转向图论和DP咯!我今天为什么开心呢?其实数学没码题我心里还是有点虚的,不过我码了一下午裸的Splay,没找板子,我能说是因为看不上吗。。。所以一个板子我码了一下午。。。好在是过了。但这不是令我开心的事。那什么是呢?哈哈哈,我“盗”了MIKE神犇的Splay模板!!!MIKE的板子实在太牛逼了,优美优美优美,简直是Splay界的一股清流,我第一眼看到它就爱上它了。我自己的码了好几个小时,200行,MIKE的只码了二十分钟,100行。清晰整洁不容易写错,我还拿给我妈看了。。。当码了一遍这个板子后,莫名觉得我稳了。哈哈哈哈哈哈哈哈。
COGS1829 [Tyvj 1728]普通平衡树 (http://218.28.19.228:8080/cogs/problem/problem.php?pid=1829)
贴上全网最清新Splay板子。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int M=100000+10;
struct SplayTree {
int cnt,root,l[M],r[M],v[M],s[M];
SplayTree():cnt(0),root(0) {
memset(l,0,sizeof(l)); memset(r,0,sizeof(r));
memset(v,0,sizeof(v)); memset(s,0,sizeof(s));
}
void update(int x) {
s[x]=s[l[x]]+s[r[x]]+1;
}
void l_rot(int &x) {
int y=r[x];
r[x]=l[y],l[y]=x;
update(x),update(y);
x=y;
}
void r_rot(int &x) {
int y=l[x];
l[x]=r[y],r[y]=x;
update(x),update(y);
x=y;
}
int maxx(int x) {
for(;r[x];x=r[x]);
return v[x];
}
void splay(int &x,int k) {
if(v[x]==k) return ;
if(k<v[x]) splay(l[x],k),r_rot(x);
else splay(r[x],k),l_rot(x);
}
void merge(int &x,int &y) {
if(!x) root=y;
else if(!y) root=x;
else splay(x,maxx(x)),r[x]=y,root=x;
}
void insert(int &x,int k) {
if(!x) x=++cnt,v[x]=k,s[x]=1;
else if(k<v[x]) insert(l[x],k),r_rot(x);
else insert(r[x],k),l_rot(x);
}
void delet(int &x,int k) {
splay(root,k);
merge(l[root],r[root]);
}
int rank(int x,int k,int ans) {
while(x)
if(v[x]<k) ans+=s[l[x]]+1,x=r[x];
else x=l[x];
return ans;
}
int kth(int x,int k,int ans) {
while(x) {
int q=s[l[x]]+1;
if(q==k) { ans=v[x]; break; }
else if(k<q) x=l[x]; else x=r[x],k-=q;
}
splay(root,ans);
return ans;
}
int pre(int x,int k,int ans) {
while(x)
if(v[x]<k) ans=max(ans,v[x]),x=r[x];
else x=l[x];
splay(root,ans);
return ans;
}
int suc(int x,int k,int ans) {
while(x)
if(v[x]>k) ans=min(ans,v[x]),x=l[x];
else x=r[x];
splay(root,ans);
return ans;
}
}t;
int main() {
int m,opt,x;
scanf("%d",&m);
while(m--) {
scanf("%d%d",&opt,&x);
if(opt==1) t.insert(t.root,x);
else if(opt==2) t.delet(t.root,x);
else if(opt==3) printf("%d\n",t.rank(t.root,x,1));
else if(opt==4) printf("%d\n",t.kth(t.root,x,0));
else if(opt==5) printf("%d\n",t.pre(t.root,x,(int)-1e8));
else printf("%d\n",t.suc(t.root,x,(int)1e8));
}
return 0;
}
板子来源于MIKE提交的
COGS2457 [HZOI 2016][Tyvj 1729]文艺平衡树 (http://218.28.19.228:8080/cogs/problem/problem.php?pid=2457)
http://218.28.19.228:8080/cogs/submit/code.php?id=312743
今天结束的好早啊,之后2~3天的内容是Splay,块状链表,树剖和动态树。
寒假过去一半了,既开心又有点焦虑。开心是因为开学就可以见到女神了,焦虑是因为省选越来越近了。
嗯。