我今天有点开心啊!上午把数学结了,但是后两章的题码的比较少,函数那章只码了一道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,块状链表,树剖和动态树。
寒假过去一半了,既开心又有点焦虑。开心是因为开学就可以见到女神了,焦虑是因为省选越来越近了。
嗯。