bzoj3595 方伯伯的oj

FAQ

..................................

splay有那么慢么  为何cena测4.5s  交了就是TLE

学校机子应该没有bzoj的好吧.............


#include <cstdio>
#include <cmath>
#include <map>
#define LL long long
#define lp(i,j,k) for(int i = j;i <= k;++i)
std::map<int,int>SPL_ORD;//以 i 为编号的 点 在 splay的顺序
int re,n,m,x,y,a,cnt = 1,fr = 0,be = 100000000;char c;
int root = 1,ch[200020][2],fa[200020],sz[200020],num[200020],ord[200020];
int key[200020],L[200020],R[200020];//键值表示点号   LL为一个区间
inline int read () {
	c = getchar();
	re = 0;
	while(c <= '9' && c >= '0') {
		re *=10;
		re += c - '0';
		c = getchar();
	}
	return re;
}
inline void rot (int X,int d) {
	int t = sz[X];
	sz[X] = sz[fa[X]];
	sz[fa[X]] -= t;
	sz[fa[X]] += sz[ch[X][d]];
	ch[fa[X]][d ^ 1] = ch[X][d];
	if(ch[X][d])
		fa[ch[X][d]] = fa[X];
	t = fa[fa[X]];
	fa[fa[X]] = X;
	ch[X][d] = fa[X];
	fa[X] = t;
	if(!t)
		return;
	if(ch[t][0] == ch[X][d])
		ch[t][0] = X;
	else ch[t][1] = X;
}
inline void splay (int X) {
	while(fa[X]) {
		if(fa[fa[X]]) {
			int d = ch[fa[fa[X]]][0] == fa[X];
			if(ch[fa[X]][d] == X) {
				rot(X,d ^ 1);
				rot(X,d);
			}
			else {
				rot(X,d);
				rot(X,d);
			}
		}
		else {
			if(ch[fa[X]][1] == X)
				rot(X,0);
			else rot(X,1);
		}
	}
	root = X;
}
inline void push_up (int X) {
	if(L[X])		
		sz[X] = R[X] - L[X] + 1;
	else sz[X] = 1;
	sz[X] += sz[ch[X][0]] + sz[ch[X][1]];
}
inline void split (int poi,int X) {
	int t1 = sz[ch[X][0]];
	int t2 = sz[ch[X][1]];
	if(L[X] != poi) {
		++cnt;
		ch[cnt][0] = ch[X][0];
		if(ch[X][0])
			fa[ch[X][0]] = cnt;
		fa[cnt] = X;
		ch[X][0] = cnt;
		if(L[X] + 1 == poi)
			ord[cnt] = num[cnt] = key[cnt] = L[X];
		else {
			L[cnt] = L[X];
			R[cnt] = poi - 1;
		}
		sz[cnt] = sz[X] - t2 - (R[X] - poi + 1);
	}
	if(R[X] != poi) {
		++cnt;
		ch[cnt][1] = ch[X][1];
		if(ch[X][1])
			fa[ch[X][1]] = cnt;
		fa[cnt] = X;
		ch[X][1] = cnt;
		if(poi + 1 == R[X])
			ord[cnt] = num[cnt] = key[cnt] = R[X];
		else {
			L[cnt] = poi + 1;
			R[cnt] = R[X];
		}
		sz[cnt] = sz[X] - t1 - (poi - L[X] + 1);
	}
	ord[X] = num[X] = key[X] = poi;
	L[X] = R[X] = 0;
}
int find (int Ord,int X) {
	if(L[X]) {
		if(Ord >= L[X] && Ord <= R[X]) {
			split(Ord,X);
			return X;
		}
		else {
			if(Ord > R[X])
				return find(Ord,ch[X][1]);
			else return find(Ord,ch[X][0]);
		}
	}
	else {
		if(ord[X] == Ord)
			return X;
		if(ord[X] > Ord)
			return find(Ord,ch[X][0]);
		return find(Ord,ch[X][1]);
	}
}
int rank (int goal,int X,int now) {
	now += sz[ch[X][1]];
	if(L[X]) {
		if(goal <= now + R[X] - L[X] && goal >= now) {
			split(R[X] - goal + now,X);
			return X;
		}
		else {
			if(goal < now)
				return rank(goal,ch[X][1],now - sz[ch[X][1]]);
			return rank(goal,ch[X][0],now + R[X] - L[X] + 1);
		}
	}
	else {
		if(now == goal)
			return X;
		if(now > goal)
			return rank(goal,ch[X][1],now - sz[ch[X][1]]);
		return rank(goal,ch[X][0],now + 1);
	}
}
int main () {
	n = read();
	m = read();
	L[1] = root = 1;
	R[1] = sz[1] = n;
	lp(i,1,m) {
		x = read();
		if(x == 1) {
			x = read();
			y = read();
			x -= a;
			y -= a;
			int t = SPL_ORD[x];
			if(!t)
				t = x;
			SPL_ORD[y] = t;
			splay(find(t,root));
			a = n - sz[ch[root][1]];
			printf("%d\n",a);
			num[root] = y;
		}
		else {
			if(x == 2) {
				x = read();
				x -= a;
				int t = SPL_ORD[x];
				if(!t)
					t = x;
				splay(find(t,root));
				a = n - sz[ch[root][1]];
				printf("%d\n",a);
				t = ch[root][0];
				if(t) {
					while(ch[t][1])
						t = ch[t][1];
					splay(t);
					int SPL_poi = ch[root][1];
					ch[root][1] = ch[SPL_poi][1];
					if(ch[SPL_poi][1])
						fa[ch[SPL_poi][1]] = root;
					push_up(root);
					fa[SPL_poi] = 0;
					ch[SPL_poi][1] = root;
					fa[root] = SPL_poi;
					root = SPL_poi;
					//push_up(root);
					sz[root] = sz[ch[root][0]] + sz[ch[root][1]] + 1;
					SPL_ORD[num[root]] = --fr;
					ord[root] = fr;
				}
			}
			else {
				if(x == 3) {
					x = read();
					x -= a;
					int t = SPL_ORD[x];
					if(!t)
						t = x;
					splay(find(t,root));
					a = n - sz[ch[root][1]];
					printf("%d\n",a);
					t = ch[root][1];
					if(t) {
						while(ch[t][0])
							t = ch[t][0];
						splay(t);
						int SPL_poi = ch[root][0];
						ch[root][0] = ch[SPL_poi][0];
						if(ch[SPL_poi][0])
							fa[ch[SPL_poi][0]] = root;
						push_up(root);
						fa[SPL_poi] = 0;
						ch[SPL_poi][0] = root;
						fa[root] = SPL_poi;
						root = SPL_poi;
						//push_up(root);
						sz[root] = sz[ch[root][0]] + sz[ch[root][1]] + 1;
						SPL_ORD[num[root]] = ++be;
						ord[root] = be;
					}
				}
				else {
					x = read();
					x -= a;
					a = rank(n - x + 1,root,1);
					splay(a);
					a = num[root];
					printf("%d\n",a);
				}
			}
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值