BZOJ3685 普通 van Emde Boas 树 题解(vEB 树模板题)
(题目描述略)
vEB 树的模板题,似乎用 zkw 线段树也可以过。
因为 vEB 树的建树过程花费大量时间,所以若用 STL 中的 vector 开不定长数组,其常数之大难免有超时的危险。解决方法是用统一的外部数组保存,记下每个节点在外部数组中的开始位置,并保证每个节点在外部数组中占用的地址连续。
最后,还是请 KikiDMW 大神帮助了面对超时问题无解的笔者,写了一段读入优化的代码,才勉强保证了时间在可接受的范围之内。
这里有个细节:vEB 树维护的是从 0 到 n - 1 的区间,所以建树时大小为 n + 1。
代码如下:
#include"math.h"
#include"stdio.h"
#define MAX_N (1500000)
#define NIL (-1)
#define Exchange_Integer(x,y) \
{ \int __tmp_x=x; \x=y,y=__tmp_x; \
}
struct VANEMDEBOAS_TREE;
inline void in(int &x);
int cluster_top=0;
VANEMDEBOAS_TREE *cluster[MAX_N];
struct VANEMDEBOAS_TREE
{int c,max,min,sqr,u;VANEMDEBOAS_TREE *summary;int High(int x){return (int)(x/sqr);}int Low(int x){return x%sqr;}int Index(int x,int y){return x*sqr+y;}inline int Maximum(){return max;}inline int Minimum(){return min;}bool Member(int x){if(min==x||max==x)return true;if(u<=2)return false;return cluster[c+High(x)]->Member(Low(x));}int Successor(int x){if(u<=2)if(max==1&&x==0)return 1;elsereturn NIL;if(min!=NIL&&min>x)return min;int max_low=cluster[c+High(x)]->Maximum();if(max_low!=NIL&&max_low>Low(x))return Index(High(x),cluster[c+High(x)]->Successor(Low(x)));int succ_cluster=summary->Successor(High(x));if(succ_cluster==NIL)return NIL;return Index(succ_cluster,cluster[c+succ_cluster]->Minimum());}int Predecessor(int x){if(u<=2)if(min==0&&x==1)return 0;elsereturn NIL;if(max!=NIL&&max<x)return max;int min_low=cluster[c+High(x)]->Minimum();if(min_low!=NIL&&min_low<Low(x))return Index(High(x),cluster[c+High(x)]->Predecessor(Low(x)));int pred_cluster=summary->Predecessor(High(x));if(pred_cluster==NIL)if(min!=NIL&&min<x)return min;elsereturn NIL;return Index(pred_cluster,cluster[c+pred_cluster]->Maximum());}void Insert(int x){if(min!=NIL&&min!=x){if(min>x)Exchange_Integer(min,x);if(u>2){if(cluster[c+High(x)]->Minimum()==NIL)summary->Insert(High(x));cluster[c+High(x)]->Insert(Low(x));}if(max<x)max=x;}else if(min!=x)max=min=x;}void Delete(int x){if(max!=min&&u>2){if(min==x)min=x=Index(summary->Minimum(),cluster[c+summary->Minimum()]->Minimum());cluster[c+High(x)]->Delete(Low(x));if(cluster[c+High(x)]->Minimum()==NIL){summary->Delete(High(x));if(max==x)if(summary->Maximum()!=NIL)max=Index(summary->Maximum(),cluster[c+summary->Maximum()]->Maximum());elsemax=min;}else if(max==x)max=Index(High(x),cluster[c+High(x)]->Maximum());}else if(max!=min&&u==2)max=min=1-x;else if(min==x)max=min=NIL;}
};
void VEBT_Create(VANEMDEBOAS_TREE *V,int u)
{V->max=V->min=NIL;V->u=u;if(u>2){V->c=cluster_top;V->sqr=(int)sqrt(u);V->sqr=V->sqr*V->sqr<u?V->sqr+1:V->sqr;int x=u/V->sqr;for(int i=0;i<x;i++)cluster[cluster_top++]=new VANEMDEBOAS_TREE;if(u%V->sqr>0)cluster[cluster_top++]=new VANEMDEBOAS_TREE;for(int i=0;i<x;i++)VEBT_Create(cluster[V->c+i],V->sqr);if(u%V->sqr>0)VEBT_Create(cluster[V->c+x++],u%V->sqr);V->summary=new VANEMDEBOAS_TREE;VEBT_Create(V->summary,x);}elseV->summary=NULL;
}
int main()
{int m,n;VANEMDEBOAS_TREE *vEBTree=new VANEMDEBOAS_TREE;in(n);in(m);VEBT_Create(vEBTree,n+1);while(m--){in(n);switch(n){case 1:in(n);vEBTree->Insert(n);break;case 2:in(n);vEBTree->Delete(n);break;case 3:printf("%d\n",vEBTree->Minimum());break;case 4:printf("%d\n",vEBTree->Maximum());break;case 5:in(n);printf("%d\n",vEBTree->Predecessor(n));break;case 6:in(n);printf("%d\n",vEBTree->Successor(n));break;case 7:in(n);printf("%d\n",vEBTree->Member(n)?1:-1);break;}}return 0;
}inline void in(int &x){x = 0; char c; c = getchar();while(c < '0' || c > '9') c = getchar();while(c >= '0' && c <= '9'){x = x * 10 + c - '0';c = getchar();}
}
BZOJ3685 普通 van Emde Boas 树 题解(vEB 树模板题)相关推荐
- BZOJ3685普通van Emde Boas树
3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 962 Solved: 319 Description 设计 ...
- bzoj3685普通van Emde Boas树 线段树
3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 1932 Solved: 626 [Submit][St ...
- Van Emde Boas Trees
## 介绍 ## van Emde Boas trees 支持所有优先级优先级队列的操作,并且巧妙的是它对于SEARCH, INSERT,DELETE,MINIMUM,MAXMUN,SUCCESSOR ...
- 【adoo】Van Emde Boas trees
各种姿势补充中--转自http://www.roading.org/algorithm/introductiontoalgorithm/Van_Emde_Boas_trees.html van Emd ...
- 【bzoj3685】普通van Emde Boas树 线段树
普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 1969 Solved: 639 [Submit][Status][ ...
- van Emde Boas Trees(vEB树)(Introduction to Algorithms, 算法导论,CLRS)学习笔记
van Emde Boas Trees 1. Predecessor search/ordered sets predecessor: return the nearest left neighbor ...
- 算法导论读书笔记(20)van Emde Boas树
第五部分 高级数据结构 第20章 van Emde Boas树 van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏情况运行时间为O(lglgn).而这种数据结构限制关键字必须为 ...
- van Emde Boas 树 数据结构说解
van Emde Boas 树的定义 直观上看,vEB 树保存了一个有序的集合,并支持以 O(lglgn) 的时间复杂度在 vEB 树上进行最小最大值查询.单值存在性查询.单值前驱后继查询.单值插入维 ...
- 算法导论-van Emde Boas树
van Emde Boas树 van Emde Boas树中文名不知道,所以暂且叫它v树吧.v树是一种数据结构,和二叉树.红黑树类似.一种数据结构被创建出来,肯定有其特别的优点,v树的优点就是实现数据 ...
最新文章
- 缓存算法(页面置换算法)-FIFO、LFU、LRU
- wxWidgets:wxIconizeEvent类用法
- 博物馆守卫问题(世界名画展览馆)
- 27. 考研与工作怎么选择
- Android 关于fragment切换重新加载的解决分享给大家
- HttpWebRequest的timeout和ReadWriteTimeout
- CloseableHttpClient 在使用过程中遇到的问题
- 电脑基本快捷键,你知道多少?
- 数字信号处理原理及实现一书的思维导图
- 如何压缩PPT文档的大小
- 打字时全部是繁体字,如何改为简体中文?
- 青柚文案:水果店青柚推广文案,水果青柚广告文案
- NUL 与 NULL
- PCB过孔的图文介绍
- 8月31日下午3点半夏昕、林信良做客CSDN畅谈轻量级框架——Spring
- javascript严格模式详解
- Visual Studio Code (Ubuntu)安装与配置
- 玉米社:抖音账号被限流了怎么办?一步步教你解除限制
- 人工智能时代创造少儿编程实用能力
- uni-app转小程序ios video不生效+视频播放不了、黑屏问题
热门文章
- 喜迎2015年新年:坦克大战(Robocode)游戏编程比赛图文总结
- 大赛首单惊人:一天收益20%
- oracle查询不重复的列,ORACLE查问不重复字段的全部列
- 太原理工大学软件学院数据库实验四(2021.4.26)
- 软件工程点菜系统的需求分析
- 先进半导体材料与器件Chapter5
- 【转】什么是文案策划?文案策划怎么写?通通告诉你。。。
- leetcode 滑动窗口—— 209/1456
- python 求离差_R中Chisquared离差检验的误差
- 如何利用笔记本分享热点(不用软件)