bzoj3595 方伯伯的oj

本文深入探讨了Splay树(伸展树)的数据结构及其实现细节,包括节点旋转、伸展操作等核心机制,并通过具体示例展示了如何利用Splay树解决复杂问题。

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);
				}
			}
		}
	}
}


下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控与管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保面的创新。 • 教育与实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于与主流深度学习框架集成,如YOLO系列、PyTorch等,便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决案提供可靠数据支持,具有重要的社会意义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值