(题目描述略)

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 树模板题)相关推荐

  1. BZOJ3685普通van Emde Boas树

    3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 962 Solved: 319 Description 设计 ...

  2. bzoj3685普通van Emde Boas树 线段树

    3685: 普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MB Submit: 1932  Solved: 626 [Submit][St ...

  3. Van Emde Boas Trees

    ## 介绍 ## van Emde Boas trees 支持所有优先级优先级队列的操作,并且巧妙的是它对于SEARCH, INSERT,DELETE,MINIMUM,MAXMUN,SUCCESSOR ...

  4. 【adoo】Van Emde Boas trees

    各种姿势补充中--转自http://www.roading.org/algorithm/introductiontoalgorithm/Van_Emde_Boas_trees.html van Emd ...

  5. 【bzoj3685】普通van Emde Boas树 线段树

    普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MB Submit: 1969  Solved: 639 [Submit][Status][ ...

  6. van Emde Boas Trees(vEB树)(Introduction to Algorithms, 算法导论,CLRS)学习笔记

    van Emde Boas Trees 1. Predecessor search/ordered sets predecessor: return the nearest left neighbor ...

  7. 算法导论读书笔记(20)van Emde Boas树

    第五部分 高级数据结构 第20章 van Emde Boas树 van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏情况运行时间为O(lglgn).而这种数据结构限制关键字必须为 ...

  8. van Emde Boas 树 数据结构说解

    van Emde Boas 树的定义 直观上看,vEB 树保存了一个有序的集合,并支持以 O(lglgn) 的时间复杂度在 vEB 树上进行最小最大值查询.单值存在性查询.单值前驱后继查询.单值插入维 ...

  9. 算法导论-van Emde Boas树

    van Emde Boas树 van Emde Boas树中文名不知道,所以暂且叫它v树吧.v树是一种数据结构,和二叉树.红黑树类似.一种数据结构被创建出来,肯定有其特别的优点,v树的优点就是实现数据 ...

最新文章

  1. 缓存算法(页面置换算法)-FIFO、LFU、LRU
  2. wxWidgets:wxIconizeEvent类用法
  3. 博物馆守卫问题(世界名画展览馆)
  4. 27. 考研与工作怎么选择
  5. Android 关于fragment切换重新加载的解决分享给大家
  6. HttpWebRequest的timeout和ReadWriteTimeout
  7. CloseableHttpClient 在使用过程中遇到的问题
  8. 电脑基本快捷键,你知道多少?
  9. 数字信号处理原理及实现一书的思维导图
  10. 如何压缩PPT文档的大小
  11. 打字时全部是繁体字,如何改为简体中文?
  12. 青柚文案:水果店青柚推广文案,水果青柚广告文案
  13. NUL 与 NULL
  14. PCB过孔的图文介绍
  15. 8月31日下午3点半夏昕、林信良做客CSDN畅谈轻量级框架——Spring
  16. javascript严格模式详解
  17. Visual Studio Code (Ubuntu)安装与配置
  18. 玉米社:抖音账号被限流了怎么办?一步步教你解除限制
  19. 人工智能时代创造少儿编程实用能力
  20. uni-app转小程序ios video不生效+视频播放不了、黑屏问题

热门文章

  1. 喜迎2015年新年:坦克大战(Robocode)游戏编程比赛图文总结
  2. 大赛首单惊人:一天收益20%
  3. oracle查询不重复的列,ORACLE查问不重复字段的全部列
  4. 太原理工大学软件学院数据库实验四(2021.4.26)
  5. 软件工程点菜系统的需求分析
  6. 先进半导体材料与器件Chapter5
  7. 【转】什么是文案策划?文案策划怎么写?通通告诉你。。。
  8. leetcode 滑动窗口—— 209/1456
  9. python 求离差_R中Chisquared离差检验的误差
  10. 如何利用笔记本分享热点(不用软件)