洛谷P3369 普通平衡树

刚学平衡树,分别用了Splay和fhq-treap交了一遍。
这是Splay的板子,貌似比较短?

Splay

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100005, INF = 2e9;int n;
int nid, root;
int fa[N], ch[N][2];
int val[N];
int sz[N], rep[N];void update(int x) {sz[x] = sz[ch[x][0]]+sz[ch[x][1]]+rep[x];
}void rotate(int x) {int y = fa[x], z = fa[y];int d = ch[fa[x]][1]==x;ch[z][ch[fa[y]][1]==y] = x; fa[x] = z;ch[y][d] = ch[x][d^1]; fa[ch[x][d^1]] = y;ch[x][d^1] = y; fa[y] = x;update(y); update(x);
}void splay(int x, int goal) {for(; fa[x] != goal; rotate(x)) if(fa[fa[x]] != goal)(ch[fa[x]][0]==x)^(ch[fa[fa[x]]][0]==fa[x]) ? rotate(x) : rotate(fa[x]);if(!goal) root = x;
}void find(int v) {int u = root;if(!u) return ;while(ch[u][val[u]<v] && val[u] != v) u = ch[u][val[u]<v];splay(u, 0);
}int findPre(int v) {find(v);int u = root;if(val[u] < v) return u;u = ch[u][0];while(ch[u][1]) u = ch[u][1];return u;
}int findNxt(int v) {find(v);int u = root;if(val[u] > v) return u;u = ch[u][1];while(ch[u][0]) u = ch[u][0];return u;
}void insert(int v) {int u = root, f = 0;while(u && val[u] != v) f = u, u = ch[u][val[u]<v];if(u) rep[u]++;else {nid++;fa[nid] = f;ch[f][val[f]<v] = nid;val[nid] = v;sz[nid] = rep[nid] = 1;u = nid;}splay(u, 0);
}void del(int v) {int pre = findPre(v), nxt = findNxt(v);splay(pre, 0); splay(nxt, pre);int tar = ch[nxt][0];if(rep[tar] > 1) {rep[tar]--;splay(tar, 0);}else ch[nxt][0] = 0;
}int kth(int x) {if(sz[root] < x) return 0;int u = root;while(1) {int lson = ch[u][0];if(x <= sz[lson]) u = lson;else if(x > sz[lson]+rep[u]) x -= sz[lson]+rep[u], u = ch[u][1];else return val[u];}
}int main() {insert(-(1<<31)+2); //添加两个哨兵节点,防止越界insert((1<<31)-2);ios_base::sync_with_stdio(false);cin.tie(0); cout.tie(0);cin >> n;for(int i = 1, c, x; i <= n; i++) {cin >> c >> x;if(c == 1) insert(x);else if(c == 2) del(x);else if(c == 3) find(x), cout << sz[ch[root][0]] << endl;else if(c == 4) cout << kth(x+1) << endl;else if(c == 5) cout << val[findPre(x)] << endl;else if(c == 6) cout << val[findNxt(x)] << endl;}return 0;
}

这是fhq-treap的板子(为了美观,我已经不能再无脑压行了)

fhq-treap

#include <iostream>
#include <cstring>
#include <algorithm>
#include <ctime>using namespace std;const int N = 100005;int n;
int ch[N][2], val[N], sz[N], rnd[N];
int nid, root;void update(int x) {sz[x] = sz[ch[x][0]]+sz[ch[x][1]]+1;
}int merge(int x, int y) {if(!x || !y) return x+y;if(rnd[x] < rnd[y]) {ch[x][1] = merge(ch[x][1], y);update(x);return x;} else {ch[y][0] = merge(x, ch[y][0]);update(y);return y;}
}void split(int cur, int k, int &x, int &y) {if(!cur) x = y = 0;else {if(val[cur] <= k) x = cur, split(ch[cur][1], k, ch[cur][1], y);else y = cur, split(ch[cur][0], k, x, ch[cur][0]);update(cur);}
}int newNode(int v) {val[++nid] = v;sz[nid] = 1;rnd[nid] = rand();return nid;
}void insert(int v) {int x, y;split(root, v, x, y);root = merge(merge(x, newNode(v)), y);
}void del(int v) {int x, y, z;split(root, v, x, z); split(x, v-1, x, y);y = merge(ch[y][0], ch[y][1]);root = merge(merge(x, y), z);
}int rankOf(int v) {int x, y, ret;split(root, v-1, x, y);ret = sz[x]+1;root = merge(x, y);return ret;
}int kth(int src, int x) {if(sz[src] < x) return 0;int u = src;while (1) {if(x <= sz[ch[u][0]]) u = ch[u][0];else if(sz[ch[u][0]]+1 == x) return u;else if(sz[ch[u][0]]+1 < x) x -= sz[ch[u][0]]+1, u = ch[u][1];}
}int precursor(int v) { //前驱int x, y, ret;split(root, v-1, x, y);ret = val[kth(x, sz[x])];root = merge(x, y);return ret;
}int successor(int v) { //后继int x, y, ret;split(root, v, x, y);ret = val[kth(y, 1)];root = merge(x, y);return ret;
}int main() {srand((unsigned)time(NULL));ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n;for(int i = 1, c, x; i <= n; i++) {cin >> c >> x;if(c == 1) insert(x);else if(c == 2) del(x);else if(c == 3) cout << rankOf(x) << endl;else if(c == 4) cout << val[kth(root, x)] << endl;else if(c == 5) cout << precursor(x) << endl;else if(c == 6) cout << successor(x) << endl;}return 0;
}

转载于:https://www.cnblogs.com/dummyummy/p/9340015.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用专用文件夹隐藏文件 (tasks、fonts)

专用文件夹控制面板、回收站和计划任务文件夹%systemroot%tasks 。 可以通过在cmd.exe 下复制一个文件过去。例如&#xff1a; copy abc.txt %systemroot%tasks 键入&#xff1a; cd %systemroot%tasks 你可以看到&#xff0c;文件已经复制到了tasks目录中了。但是如果你通过资…

一个注册为输入法的木马分析

我已把此木马样本传到以下链接&#xff1a;http://download.csdn.net/detail/cs08211317dn/4096819 一&#xff0e;大致描述&#xff1a; 1. 样本名称&#xff1a;z.exe 2. 家族名&#xff1a; PWS:Win32/Zuten.gen!D(MIcrosoft) 3. MD5&#xff1a;E298C3…

剑指Offer名企面试官精讲典型编程题pdf

下载地址&#xff1a;网盘下载 《剑指Offer&#xff1a;名企面试官精讲典型编程题&#xff08;第2版&#xff09;》剖析了80个典型的编程面试题&#xff0c;系统整理基础知识、代码质量、解题思路、优化效率和综合能力这5个面试要点。《剑指Offer&#xff1a;名企面试官精讲典型…

木马爱修改的常见注册表项及其功能

IE相关&#xff1a; 设置IE多线程下载网页的线程数&#xff1a; HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings MaxConnectionPerServer&#xff08;字符串值&#xff09; 10&#xff08;设置最大同步下载连接数为10&#xf…

使用fiddler的过滤条件

使用fiddler抓包的时候经常一下子显示很多的记录&#xff0c;看的眼花缭乱&#xff0c;需要这时候需要使用过滤条件来帮助你&#xff0c;一般常用的有三种过滤条件&#xff1a; 1.域名过滤&#xff0c;只显示特定域名的记录&#xff1a; *.baidu.com表示所有的百度二级域名会话…

贪心之活动选择问题

将活动按照结束时间单调递增排序 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm>using namespace std;struct node {int b,e; }a[1000],temp;int cmp(node x,node y) {return x.e<y.e; }int main() {int i,j,n,p,…

IceSword偏门功能介绍

&#xff08;1&#xff09;进程窗口中单击右键&#xff0c;选择“内存读写”&#xff0c;弹出如下对话框&#xff1a; 输入起始地址和长度就可以读写内存&#xff0c;以及对这段内存进行反汇编。 &#xff08;2&#xff09;用IceSword的监视进线程创建和监视进程终止功能&…

DOS命令 format

作用&#xff1a; 对磁盘进行格式化&#xff0c;划分磁道和扇区&#xff1b;同时检查出整个磁盘上有无带缺陷的磁道&#xff0c;对坏道加注标记&#xff1b;建立目录区和文件分配表&#xff0c;使磁盘作好接收DOS的准备。 格式&#xff1a;format〈盘符&#xff1a;〉[/S][/4][…

怎么将电脑的图片不用打开也能显示出来

win7系统&#xff0c;打卡资源管理器&#xff0c;组织&#xff0c;文件夹选项&#xff0c;查看&#xff0c;去掉“始终显示图标&#xff0c;从不显示缩略图”前面的勾&#xff0c;确定。其它系统的位置大同小异转载于:https://www.cnblogs.com/flyoung/p/9376122.html

系统图标及其注册表项

在桌面右击--属性----效果---在里面可以更改系统图标 改注册表&#xff1a; 作 用:修改系统文件夹的图标 路 径:HKEY_CLASSES_ROOT&#xff3c;CLSID&#xff3c;系统文件夹的ID 键值名称:DefaultIcon 键 值:缺省数据修改为你喜欢的图标所在的位置。 作 用:快捷方式图标上的箭头…

【Apache】Apache ab压力测试工具Window下载和用法详解

ab是apache自带的网站压力测试工具。 使用起来非常的简单和方便。 不仅仅是可以apache服务器进行网站访问压力测试&#xff0c;还可以对其他类型的服务器进行压力测试。 比如nginx,tomcat&#xff0c;IIS等 首先当然是下载安装了。 在这里只讲window下在下载安装 官方下载地址&…

中华黑豹增强版木马分析

样本网址&#xff1a;http://download.csdn.net/detail/cs08211317dn/4144024 一&#xff0e; 大致描述&#xff1a; 1. 样本名称&#xff1a;中华黑豹增强版.exe 2. 家族名&#xff1a; TrojanDownloader:VBS/Lnkget.D(Microsoft) 3. MD5&#xff…

epoll源码分析

epoll源码分析 最近在使用libev过程中遇到一个场景&#xff1a;一个fd从一个ev_loop迁移到另一个ev_loop&#xff0c;会出现这个fd同时存在两个epoll的瞬间。不禁要问了&#xff0c;一个fd同时被两个epoll监视的行为是怎样的&#xff0c;epoll嵌套使用是怎样实现的&#xff1f;…

C#编程简单应用程序批量修改文件名

用C#编写的程序&#xff0c;可以将所在文件夹内的Photo1.png~Photo10.png十个文件&#xff0c;按照指定的顺序改名为不同的.jpg文件&#xff1a; 【程序代码如下】 using System; using System.IO;class Program {static void Main(string[] args){string folderPath "…

vc++类型转换

一&#xff0e;VC常用数据类型列表 二&#xff0e;常用数据类型转化 2.1数学类型变量与字符串相互转换 2.2 CString及string,char *与其他数据类型的转换和操作 ●CString,string,char*的综合比较 ●数学类型与CString相互转化 ●CString与char*相互转换举例 ●CString 与 BSTR…

C Shuffle Cards

牛客网暑期ACM多校训练营&#xff08;第三场&#xff09; C Shuffle Cards 题目&#xff1a; 链接&#xff1a;https://www.nowcoder.com/acm/contest/141/C来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C 262144K&…

用windows api 计算文件的md5值

我自己封装了一个函数GetMd5(LPCWSTR FileDirectory)。其中调用了windows api&#xff1a;CryptAcquireContext&#xff0c;CryptCreateHash,CryptHashData等。要计算不同文件的md5值&#xff0c;只需在调用此函数时传入不同文件的全路径即可&#xff0c;不需要额外的dll。示例…

C#调用带结构体指针的C Dll的方法

C#调用带结构体指针的C Dll的方法 原文:C#调用带结构体指针的C Dll的方法在C#中调用C&#xff08;C&#xff09;类的DLL的时候&#xff0c;有时候C的接口函数包含很多参数&#xff0c;而且有的时候这些参数有可能是个结构体&#xff0c;而且有可能是结构体指针&#xff0c;那么…

【MFC】遍历文件夹及其子文件夹

void ScanFile(CString Dir) {CFileFind finder;CString AddL"\\*";CString DirSpecDirAdd; //补全要遍历的文件夹的目录BOOL bWorking finder.FindFile(DirSpec);while (bWorking){bWorking finder.FindNextFile();if(!finder.IsDots(…

HihoCoder - 1483 区间最值

给定n个数A1...An&#xff0c;小Ho想了解AL..AR中有多少对元素值相同。小Ho把这个数目定义为区间[L,R]的价值&#xff0c;用v[L,R]表示。 例如1 1 1 2 2这五个数所组成的区间的价值为4。 现在小Ho想知道在所有的的v[L,R](1 < L < R < n)中&#xff0c;第k小的值是多少…