Holiday 11

Posted qjs12

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Holiday 11相关的知识,希望对你有一定的参考价值。

  我今天有点开心啊!上午把数学结了,但是后两章的题码的比较少,函数那章只码了一道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,块状链表,树剖和动态树。

  寒假过去一半了,既开心又有点焦虑。开心是因为开学就可以见到女神了,焦虑是因为省选越来越近了。

  嗯。

 

以上是关于Holiday 11的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1827 Summer Holiday(强连通)

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

holiday

holiday题解