平衡树
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
STL中的set和multiset学习小记
注意,请未学习过平衡树的先去学习,再来学这个。 大神勿喷,本人蒟蒻。调用写上#include<set> 有两种,一种是set,另一是multiset。 set是集合,集合内没有相同元素,每个数出现次数0或1。 multiset是多重集,每个元素可以出现多次。 一般调用多重集,这么写。multiset <类型> 名称;set也是一样。用处集合与多重集会自动维护所属类型的顺序(我们可以改变它的原创 2015-08-24 14:37:41 · 706 阅读 · 0 评论 -
[arc065e]Manhattan Compass
题目大意不想讲。做法可以转45度角变成切比雪夫距离,这样图像是正方形。 先用bfs找出所有可以踩到的点(可以对每行每列维护set,一个被bfs到的直接在两颗平衡树中删去)。 然后对每个能被踩到的点统计与其切比雪夫距离为d的点的个数(可以对每行每列维护vector并二分)。 最后答案除以2。#include<cstdio>#include<algorithm>#include<cmath>原创 2017-11-16 21:06:15 · 959 阅读 · 0 评论 -
[bzoj4919]大根堆
题目描述给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点。每个点有一个权值v_i。 你需要将这棵树转化成一个大根堆。确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i>v_j。 请计算可选的最多的点数,注意这些点不必形成这棵树的一个连通子树。解法(不)容易看出这是一个变种LIS。 如果只有一条链就...原创 2017-07-09 21:13:17 · 1557 阅读 · 2 评论 -
Fiend
题目大意满足li<=pi<=ri的排列p,问逆序对是奇数的多还是逆序对是偶数的多或者是否一样多?解法可以构造一个矩阵,ai,li~ri是1,然后就是问它行列式的符号或判断行列式是否为0。 模拟高斯消元,每次消到第i行时,让第i行变成第i列上有1且r最小的,这样可以保证任意时刻1都是一段区间。 可以用可并堆、平衡树或线段树来快速支持合并。#include<cstdio>#include<algo原创 2017-07-07 16:43:43 · 544 阅读 · 0 评论 -
排序列表
题目大意有若干个区间,C(m)表示所有包含m这个点的区间编号排序后的序列。 求本质不同的非空字典序第k小的序列。做法先离散化,因为本质不同不会超过2n个序列。 接下来顺序扫,并维护每个位置的hash值。 遇到之前出现过的hash值就叉掉。 然后接下来枚举按字典序枚举,每次看看往字典序末尾加入i会有多少种可能。 对于k,如果它不在答案序列中,不能选择它区间所包含的m。 对于k,如果它在答案原创 2017-07-11 14:23:06 · 401 阅读 · 0 评论 -
[LibreOJ β Round]ZQC的课堂
题目描述https://www.loj.ac/problem/503题解x和y是可以分开考虑的。 设si表示某维坐标的前缀和。 要求统计多少i满足si*si-1<=0(此时会有正负交替)。 我们发现这个条件等价于max(si,si-1)>=0且min(si,si-1)<=0。 这样两个限制依然不好统计。 改成用n减去不满足条件的。 1、max(si,si-1)<=0 2、min(si,原创 2017-06-19 16:36:53 · 660 阅读 · 0 评论 -
Informatics Training
题目描述数据结构对每个小组用两个数据结构维护,分别维护体力和刷题量。 对于合并的操作,可以启发式合并。 单个修改直接在对应的数据结构里改。 小组修改可以通过打tag实现,这个tag只有在这个小组被并进另一个小组的时候才下传。注意这个tag是永久化的,因此并进另一个小组时,要把它们对另一个小组的tag进行反作用。 淘汰人可以在对应数据结构进行修改。 为了方便做考核操作,每个小组维护出刷题量最原创 2017-04-21 15:23:15 · 398 阅读 · 0 评论 -
[51nod1558][CF468D]树中的配对
题目大意一颗n个节点的树,边有边权。 求一个字典序最小的排列p 使得∑dis(i,pi)\sum dis(i,pi)最小思考∑dis(i,pi)=∑depi+deppi−2∗deplca(i,pi)=2∗∑depi−2∗∑deplca(i,pi)\sum dis(i,pi)=\sum dep_i+dep_pi-2*dep_{lca(i,pi)}=2*\sum dep_i-2*\sum dep_{原创 2017-03-22 16:48:09 · 1108 阅读 · 1 评论 -
[CF765F]Souvenirs
题目大意给定一个序列 多次询问一个区间最接近两个数的差值 最接近的两个数可以相同,但不能是同一个位置上的数。 允许离线强大线段树做法我们首先可以扫描线 从左到右扫,每次处理右端点在扫描线上的所有询问。 我们维护一颗线段树,线段树每个节点的值没有太多实际的意义,但它需要满足一个性质: 假如当前扫描线在now,那么在线段树中查询[l,now]这个区间的答案就是正确的答案 听起来很不可思议?原创 2017-02-23 17:18:25 · 1483 阅读 · 0 评论 -
灵知的太阳信仰
题目大意每个位置有两个值ai和bi。 给一个序列分成若干连续段,使得每个段内a值互不相同,代价是b的最大值。求最小代价。DP我们思考设fi表示给1~i分段的最小代价。 我们可以处理出ci表示一个最小的k使得[k,i]没有重复a。 这个随便用个桶就实现了吧。。 那么Fi=mini−1j=ci−1(Fj+max(j+1,i))Fi=min_{j=ci-1}^{i-1}(Fj+max(j+1,i)原创 2016-11-10 16:25:44 · 875 阅读 · 0 评论 -
阿凡达
题目大意一个长度为n的序列,初始全0。有两种操作。 1、将[l,r]重新设置A mod B,2A mod B,3A mod B,4A mod B,5A mod B……(r-l+1)A mod B。 2、求[l,r]的和。前置技能我们如何求∑ni=1iA mod B\sum_{i=1}^niA\ mod\ B? 就是求∑ni=1iA−⌊iAB⌋∗B\sum_{i=1}^niA-\lfloor\f原创 2016-11-03 09:40:15 · 293 阅读 · 0 评论 -
[bzoj4326][NOIP2015]运输计划
题目大意树上有许多条路径,现在你可以将一条边的权值设为0,令所有路径的最大值最小。最长路径瓶颈我们注意到,设为0的边如果不在最长路径上,就不会减小答案。 因此我们可以找出最长路径,把原树转化为一条链+许多树的模型。 预处理出每个点i的from[i]表示由链上哪个点延伸的。 接下来我们可以枚举将链上哪条边变为0,则经过这条边的最长路径一定是最长链,我们只需维护出不经过这条边的最长路径。这个显然可原创 2015-11-13 21:29:56 · 1238 阅读 · 0 评论 -
魔道研究
题目大意有3*10^5个多重集合,许多次操作,每次操作往某个集合里插入一个数。对于所有i,把第i个集合里前i大的元素加入集合S中。每次操作后你需要输出集合S中前N大元素的和。模拟模拟题意,用数据结构维护即可。 这里使用spaly。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namesp原创 2016-03-05 16:33:09 · 558 阅读 · 1 评论 -
数树数
题目大意及模型转换给定一棵由N个结点组成的树,现在有两种操作。1、将第i个结点权值改为x。2、询问第i个结点到第j个结点路径上的点有多少个权值为x。N<=100000,操作数Q<=200000。一开始第i个结点权值为v[i]。小感想2103年的题目真是鬼。。。这标题都不知道是什么鬼。。。什么可修改主席树又难打又难跳我还不会!比赛果断使用树上分块大水(分块大法好!)。题解说常熟大,加上我想到的实现方法原创 2015-08-14 21:38:10 · 1060 阅读 · 1 评论 -
Zkb
题目大意区间排序,区间求乘积十进制下的最高位。做法先转化询问。 对所有数取log10log10log_{10}。 那么乘法转化为加法。 设取logloglog后和为xxx,答案显然是⌊10x−⌊x⌋⌋⌊10x−⌊x⌋⌋\lfloor10^{x-\lfloor x\rfloor}\rfloor。 现在问题就是,区间排序,区间求和,怎么做? 可以维护若干个排序块,这个可以用平衡树...原创 2018-03-28 07:56:12 · 597 阅读 · 0 评论