COGS 2421.[HZOI 2016]简单的Treap 题解

题目大意:

给定n个数及其优先级,求对应的符合最小堆性质的Treap的先序遍历。

n<=500000。

解法:

目前为止我只想到了三种解法,其中第三种是正解。

1.暴力1

以优先级为关键字排序,然后按顺序构建BST即可。注意不能加平衡,因为这样会改变树的先序遍历。

期望复杂度O(nlogn)(排序和构建),考虑极端情况下树可能是一个链,最坏情况复杂度O(n2)。

2.暴力2

直接构建Treap,但遇到是链的情况仍然是O(n2)。

考虑将节点顺序打乱后进行建树,常数大大减小,但由于链状树的深度为n,最坏情况仍然O(n2)(这个复杂度是达哥提出的,不知道对不对)。

3.RMQ+分治

考虑以数大小为关键字排序,那么显然排序后一个点的左子树就在它的左边,右子树就在它右边,而对于一个区间[l,r],显然它对应的子树的树根就是区间中优先级最小的点,这样就转化为了RMQ问题。

具体做法:

1.把元素按数的大小排序,用Sparse-Table算法预处理RMQ。

2.初始区间为[1,n],每次从区间中选出优先级最小的点作为子树的根,递归建左子树和右子树(虽然实现过程中并不用真的建树)。

由于每个点都被选作树根并往下递归一次,而Sparse-Table的查询是O(1)的,因此总复杂度为O(nlogn)(排序),如果使用线性排序则可以降到O(n)。

后记:

这个题也是一时脑洞的产物,主要是受蓝书中Treap唯一这句话的启发,因此出了这么一道题。

这道题的解法也是一时脑洞,不过确实不错,值得借鉴。

其实一开始本来想卡暴力,发现标程最后两个点要跑1s多一点点,因此时限开的1.5s,这下暴力1就有了80分,至于暴力2,估计是卡不住的了。

最近出题不少,估计是要发扬ad神犇的优良传统了。

时间: 2024-12-24 17:29:27

COGS 2421.[HZOI 2016]简单的Treap 题解的相关文章

[COGS 2421] [HZOI 2016] 简单的Treap 笛卡尔树

笛卡尔树就是你给两维限制,一维堆R,一维二叉搜索树K,平地拔起一棵Treap,最广范的应用:用LCA求区间最值,建Treap,还有个什么范围top k我表示并不会查都查不到.它最妙最高的地方在于用栈来建树:我们可以先排序K然后一个个插入,那么我们都是最右端,横容易被卡,那么我们不从上到下,我们从下到上,用栈维护,那就把时间复杂度从O(n^2)降到O(n),具体过程见下图从图一到图二就是这么一个过程,我们在把K为13的点插入时要找到一个合适的位置,上比他大,下比他小(假设大根堆) 下面见代码 #i

cogs 2478. [HZOI 2016]简单的最近公共祖先

2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题目描述] 给定一棵有n个节点的有根树,根节点为1,每个节点有一个权值wi,求 即求所有无序节点对的LCA的权值之和. 树的节点编号为1~n,LCA表示两节点的最近公共祖先,即在它们的所有公共祖先中离根节点最远的节点. [输入格式] 第一行一个整数n,表示节点数. 第二行n个正整数,表示每个点的权值.

COGS 2416.[HZOI 2016]公路修建 &amp; COGS 2419.[HZOI 2016]公路修建2 题解

大意: [HZOI 2016]公路修建 给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k(k<=n-1),求原图的一个生成树,使得其中至少包含k条一级边且最大的边权值尽量小. [HZOI 2016]公路修建2 和上一题基本一样,但是求出的不一定是生成树(也就是说可以有多于n-1条边,只要让图连通即可),在此前提下仍然使得其中至少包含k条一级边且最大的边权值尽量小. 解法: 两题均可以使用

cogs 2632. [HZOI 2016] 数列操作d

2632. [HZOI 2016] 数列操作d ★★★   输入文件:segment.in   输出文件:segment.out   简单对比时间限制:3 s   内存限制:512 MB [题目描述] 一个长度为n的序列,一开始序列数的权值都是0,有m次操作 支持两种操作: 1 L R x,给区间[L,R]内位置为pos的数加上(pos-L)*x 0 L R,查询区间[L,R]内的权值和 最终答案对109+7取模. [输入格式] 第一行两个数n,m,表示序列长度和操作次数 接下来m行,每行描述一

COGS 2334. [HZOI 2016]最小函数值

时间限制:1 s   内存限制:128 MB [题目描述] 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix2+Bix+Ci(x∈N∗).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). [输入格式] 第一行输入两个正整数n和m. 以下n行每行三个正整数,其中第i行的三个数分别为Ai.Bi和Ci.输入数据保证Ai<=10,Bi<=100,Ci<=10000. [输出格式] 输出将这n个函数所有可以生成的函数值排序后的前m个元素.

COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]

传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的数据,1<=n<=50000,保证所有的ai.bi.ci分别组成三个1~n的排列. $CDQ$分治套$CDQ$分治也不是很难嘛 对于本题,设四维$a,b,c,d$ $Sort\ at\ a$ $CDQ(l,r)$ $\quad CDQ(l,mid)$ $\quad CDQ(mid+1,r)$ $\

[HZOI 2016]公路修建

2416. [HZOI 2016]公路修建 ★☆   输入文件:hzoi_road.in   输出文件:hzoi_road.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨在建立OI island的交通系统.OI island有n个旅游景点,不妨将它们从1到n标号.现在,OIER

2199. [HZOI 2016] 活动投票

★★   输入文件:hztp.in   输出文件:hztp.out   简单对比 时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多,人也很多,一次活动有n个学生参与投票,现已知一名参赛选手票数超过半数,求其参赛号(参赛号随机) [输入格式] 第一行一个整数n 第二行n个整数Ni 代表第i个学生所投选手的参赛号 [输出格式] 超过半数选手的参赛号 [样例输入] 10 5 1 2 5 5 2 3 5 5 5 [样例输出] 5 [提示] 100%的数据中:n ≤3000000,

HZOI 2016 活动投票

[HZOI 2016] 活动投票 ★★   输入文件:hztp.in   输出文件:hztp.out   简单对比 时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多,人也很多,一次活动有n个学生参与投票,现已知一名参赛选手票数超过半数,求其参赛号(参赛号随机) [输入格式] 第一行一个整数n 第二行n个整数Ni 代表第i个学生所投选手的参赛号 [输出格式] 超过半数选手的参赛号 [样例输入] 10 5 1 2 5 5 2 3 5 5 5 [样例输出] 5 [提示] 100