----平衡树
文章平均质量分 69
扩展的灰
扩展的灰(Extended Ash)
展开
-
Jzoj3901 二叉查找树
题意:给你一个bst插入的顺序问你完成这些操作需要多少次比较(即这颗bst所有节点深度之和)显然,我们在bst中插入一个节点x,它一定是它前继或者后续的儿子这样的话,我们记录每个点的深度,每次找前继和后续即可本来应该用链表的,我还是为了卡时用了ZKW线段树#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include原创 2017-10-03 20:22:09 · 332 阅读 · 0 评论 -
字符串专题1
.都是些bzoj原题辣,这几天刚做的 Bzoj4032有趣的dp题,也要用到各种自动机注意到题目的两个关键词“子串”和“子序列”考虑对A和B串建立后缀自动机和序列自动机序列自动机:可以识别一个序列所有子序列的自动机 想必学过自动机的各位都知道这个玩意怎么建,这里不再阐述让后我们考虑这些询问询问1:直接用SAM做类似LCS的做法求出A每个前缀和B匹配的最长距离,取最小+1询问2:...原创 2018-11-19 22:06:20 · 259 阅读 · 0 评论 -
LCT模板
此题是bzoj2631Lct真的是看一眼就懂的数据结构,Tarjan太强了考虑轻重链剖分,我们可以将一条路径分成log个区间而在Lct上,用splay来完成这一过程,每次将节点到根的路径强制变为重路径(Access操作)这样,就可以很方便的来完成链上的查询和修改了而换根,需要维护一个Reverse标记,每次access(x)access(x)access(x)之后将整颗splay翻转反...原创 2018-11-25 19:10:32 · 270 阅读 · 0 评论 -
CDQ分治&整体二分九连测
整体二分好难a CDQ分治&整体二分九连: A[适者] 先来一个不是cdq分治的题(虽然也可以用分治做) 首先先来考虑按照什么顺序来搞掉这些机甲 对于两个相邻的机甲i,j,先i后j的代价是Ai∗Di+(Di+Dj)∗AjAi∗Di+(Di+Dj)∗AjA_i*D_i+(D_i+D_j)*A_j 那么如果i应该比j先消灭就有 Ai∗Di+(Di+Dj)∗Aj<A...原创 2018-08-19 21:32:06 · 571 阅读 · 0 评论 -
斜率DP十连测
最近学校里很多题目都没时间做,顺便来写一下博客 斜率DP十连: A[征途] 注意到,原题的式子,等价于m∑a2i−(∑ai)2m∑ai2−(∑ai)2m\sum a_i^2-(\sum a_i)^2后面部分是常数 那么我们就可以写出dp方程f[i,j]=min{f[i−1,k]+(sj−sk)2},k<jf[i,j]=min{f[i−1,k]+(sj−sk)2},k<...原创 2018-08-12 23:59:34 · 300 阅读 · 0 评论 -
51Nod1364 最大字典序排列
题目看这里一道比较简单的贪心题容易想到从前到后确定每一位我们可以用一个splay来维护当前未确定的部分的顺序假设当前剩下k次操作机会那么我们可以求出splay中前k+1个元素中的最大元素i,令k减少rank(i),让后将其输出并从splay中删掉最后k=0时,输出splay中剩余元素比题解那个线段树好写多了,主要是不用想,而且splay还挺快的#include<stdio.h>#in...原创 2018-04-27 22:03:39 · 261 阅读 · 0 评论 -
51Nod1502 苹果曼和纸
题目点这里漏写博客好多天了,赶快来补这道题是一个裸的模拟题,注意到纸片总长度不会增加,所以用一个带翻转的splay来维护一下每次将前半段翻转和后一段做加法合并就好了,均摊logn#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#include#define N 100010#defi原创 2018-03-22 21:33:48 · 250 阅读 · 0 评论 -
51Nod1207 内存管理
题目看这里这么好玩的数据结构题肯定是要来做一做啦考虑splay-显然用一个节点去维护一个连续的内存块,每次申请内存就找一块尽可能前的,释放就找一个有相交的并合并,没有则新建节点splay一打还是错落百出,不过效率还是可以的,跑了第一和map一样快#include<stdio.h>#include<string.h>#include<algorithm>#d...原创 2018-02-19 10:17:54 · 271 阅读 · 0 评论 -
Jzoj1951 布娃娃
一开始看错题目了,很容易看成i喜欢的中,让后写主席树区间第k大反过来其实也很好做,我们考虑将所有的L,R,P丢到一起考虑,分两种操作,询问和修改(是不是很像cdq分治)排个序再加上个平衡树离散化+ZKW线段树求第k大就好了(注意题目坑点:是第k大不是第k小)#pragma GCC optimize("O3")#pragma G++ optimize("O3")#includ原创 2018-01-20 17:07:25 · 356 阅读 · 0 评论 -
Bzoj1014 外星人Prefix
题目传送门和上一篇题目几乎一样,不过还是这道题良心!bzoj好!poj慢到出*splay大法好! 两次AC不卡常!#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#include#define N 400010#define LL long long#define son(x) (原创 2017-12-01 20:38:25 · 236 阅读 · 0 评论 -
Poj2758 Checking the Text
题目传送门经典的数据结构维护字符串哈希这里用了很慢很慢的splay各种T(也可能是死循环)不过没办法因为会写splay的能力还是要有的#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#include#define N 100010#define LL long long#def原创 2017-12-01 19:06:27 · 374 阅读 · 0 评论 -
Bzoj1208 宠物收养所
最近,阿Q开了一间宠物收养所。收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值。这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要原创 2017-11-30 21:48:49 · 383 阅读 · 2 评论 -
Jzoj4384 Hashit
你有一个字符串S,最开始为空,要求支持两种操作在S后面加入字符c删除S最后一个字符每次操作询问S有多少个两两不同子串应该本来应该用SAM+Trie离线做的,然而为了练一下后缀平衡树就写了其实也很好写,用哈希比较一下就好了,可以用set实现,开一个数组存每个后缀对应的节点就好求height也可以用哈希#pragma GCC opitmize("O3")#pragma原创 2017-12-10 13:15:51 · 495 阅读 · 0 评论 -
一些基础算法的模板(持续更新)
更新中//Templates From Extended_Ash/Cooevjnz/JacaJava/Tubbcrafft//To be continued...//Suffix Automationchar str[N]; int s[N][26],mx[N],f[N],sz[N]; int last=1,cnt=1,n,v[N],r[N],ans=0; inlin原创 2017-10-25 22:05:58 · 3734 阅读 · 0 评论 -
Bzoj3196 二逼平衡树
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查询k在区间内的后继(后继定义为大于x,且最小的数)额,这个题,看了一眼就知道是线段树套线段树啦,所以随手糊一发#pragma GCC opitmize原创 2017-10-15 16:01:59 · 323 阅读 · 1 评论 -
Jzoj4699 Password
首先,orzYxuanwKeith,这套题后面两个把我虐爆了我们发现,B序列每一个元素都肯定出现在A中,那么考虑最大的元素B1,显然就是A中元素最大的那个删除后让后我们继续求B2,显然也是最大的那个,让后删除B2,gcd(B1,B2)后,我们就可以得到B3....以此类推偷懒用了map+O3#pragma GCC optimize("O3")#pragma G++ opt原创 2017-10-12 16:05:46 · 420 阅读 · 0 评论 -
ETT模板
其实这个是弹飞绵羊辣ETT比lct好写很多简单来说就是维护树的dfn序列,因为其长度为2n所以效率会不如lct这里只有换父亲的操作(用一个超级根作为所有树的父亲,就可以支持link和cut),维护的信息是节点的深度,换根到时候再学说一下几个实现的技巧可以用splay来维护,由于需要用到抽出一段的操作,建议开一个数组存每个节点的前驱和后继,这样可以省去找前驱后继的常数,但是依然没有LCT的...原创 2018-11-25 10:04:30 · 2263 阅读 · 0 评论