码迷,mamicode.com
首页 > 其他好文 > 详细

Holiday 11

时间:2018-02-19 21:11:17      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:include   mat   for   set   http   soft   date   color   fft   

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

标签:include   mat   for   set   http   soft   date   color   fft   

原文地址:https://www.cnblogs.com/qjs12/p/8454373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!