------------数据结构-----------
文章平均质量分 86
alpc_qleonardo
这个作者很懒,什么都没留下…
展开
-
HDU 5517 Triple ACM/ICPC 2015 Shenyang(二维树状数组)
题目读清楚,脑子不混乱,思路自然就会更清晰…… 这题就是给你两个集合A和B。A中每个元素包含两个数字a和b,然后B中每个元素包含三个数字c、d和e。我们规定,如果A中的i元素的b与B中的j元素的e相同,那么把这两个元素合并成<a,c,d>加入C集合中。然后,问C集合中,有多少个元素满足C中不存在某个元素的三个数字都大于等于它且不与其相等。 其实复述的也有点乱,好好理解一下吧……然后初始想法是,显然A中的元素,如果两个元素的b相等,而a一大一小,那么显然小的那个不会对结果产生贡原创 2017-09-03 20:40:09 · 466 阅读 · 0 评论 -
CodeForce 958C3 Encryption (hard)(dp+树状数组)
大致题意,给你n个数字,然后让你把这n个数字分成连续的k组,然后每一组的权值是每组所有数字的和模p。现在问所有组的权值和的极值。 首先,我们说一下这道题目的前两个版本的解法。C1是求最大值,k固定等于2,这个随便怎么暴力都行。 C2也是求最大值,然后n、k、p的范围分别是2*10^4、50和100。我们可以考虑简单的dp。令dp[i][j]表示前i个数字分成j组的最大值。有转移方程:dp[i][j]=max(dp[k][j-1]+(s[i]-s[k])%p)。可以看到这个dp的时原创 2018-04-20 23:37:08 · 409 阅读 · 0 评论 -
HDU 5820 Lights(可持久化线段树)
大致题意:有N个路灯,以坐标的形式给出每个路灯的位置,坐标区间是[1,50000]。现在问你,任意两个路灯之间是否存在一条路径,使得路径总长是两灯的曼哈顿距离,同时路径的转折点处(若有)是一个路灯。输出YES/NO。有最多5e10个点,如果暴力寻找是否存在路径显然是不行的。那么我们转而看看,如果满足存在这样的一条路径应该满足什么样的条件。我们注意到,如果两个不共线的点能够相互到达,那么一定能构成一个矩形。相反,就是一定不能构成一个矩形。可以证明,对于点(x,y),在水平方向离它最近的点为(x',y),在垂直原创 2018-05-17 20:35:49 · 307 阅读 · 0 评论 -
可持久化线段树总结
之前也写过一篇讲主席树的文章,但是那时候理解的实在是太片面了。 首先,所谓可持久化,就是说我有很多个操作,但是我在任意时刻可以回到之前的某一个操作之前的样子。或者说可以知道某一个操作之前的信息。对于普通的线段树来说,肯定是不能够支持的,那么我们如何解决这个问题呢? 最简单的,我们考虑暴力一点的方式,对于每一个操作,我在之前的基础上单独建立一棵线段树,把...原创 2018-05-16 20:34:09 · 670 阅读 · 1 评论 -
HDU Kth number(可持久化线段树)
大致题意:典型的静态区间第K大。 之前应该是写过动态区间第K大的题目,那个是用到了线段树套平衡树Treap。虽然说支持动态修改,但是这种方法的编程复杂度和代码量实在是太大,在比赛中难以接受。在这里,我们可以考虑用可持久化线段树来解决这个问题。 首先,关于区间的问题,要考虑如何只选取区间内部的数字。我们可以考虑初始数字1~N是按照顺序插入到主席树当中的,那么第i次操作就对应第i个数字被插入,第i棵线段树就对应一个包含第1~i个数字的线段树。那么显然,对于区间[l,r],如果原创 2018-05-16 20:36:40 · 614 阅读 · 0 评论 -
HDU 4348 To the moon(可持久化线段树)
大致题意:支持Q、C、H、B四种操作,分别对应查询当前区间[l,r]的和,修改区间[l,r]并使得时间加一,查询第x个时刻区间[l,r]的区间和,回到第x个时刻。 纯数据结构题目,支持回到、查询历史版本,显然是一个可持久化数据结构,而支持查询区间和以及区间修改,首选的就是可持久化线段树了。这里有一个时间的定义,所以我们对每一个时间动态建立一个线段树,每个线段树继承之前时间的信息。对于两个查询操作,直接在对应时刻版本的线段树里面查询即可,我们用rt[i]表示第i个时刻对应线段树原创 2018-05-16 21:32:33 · 299 阅读 · 0 评论 -
HDU 5809 Ants (KD_Tree + 并查集)
大致题意:有很n个蚂蚁窝,蚂蚁窝里面的蚂蚁运动的时候有一个规律,就是每次往距离它最近的蚂蚁窝走。当两对蚂蚁窝距离相同时,坐标小的那个更近。而且蚂蚁运动严格是走直线,现在有q个询问,每个询问给出两个蚂蚁窝的编号,问这两个蚂蚁窝的蚂蚁是否能够相遇。 首先,处理这个距离最近的蚂蚁窝,显然是用KD树解决。对于给出的二维坐标,建立KD树,对于每一个点求一次最近点。其次,是判断能否相遇,这个也很容易看出就是判断两个点是否在统一连通分量里面。这个用不着tarjan,直接用并查集维护即可。 方法原创 2018-07-08 16:28:51 · 438 阅读 · 0 评论 -
BZOJ 3489 A simple rmq problem(KD-Tree解法)
我们可以这么考虑,对于每一个数字,他可以有一个上一个出现的位置pre和下一个出现的位置nxt,再加上他自己的位置i,可以构成一个三维空间,坐标是(i,pre,nxt)。那么显然,对于一个询问[l,r],如果要符合条件的话,pre要小于l,nxt要大于r,同时i要在l、r之间。那么这样,转化到三维空间中,满足条件的空间就是点(l,0,nxt+1)与点(r,l-1,INF)构成的一个长方体区域。这样,答案的话就是这个满足条件的空间中数值的最大值。原创 2018-07-10 11:07:38 · 365 阅读 · 0 评论 -
计蒜客 2018 ICPC宁夏 Continuous Intervals(线段树)
大致题意:定义连续区间,即满足区间最大值与最小值之差加一恰好等于区间数字个数的区间,是连续区间。现在给你一个数列,问你这个数列的所有子区间中有多少个连续区间。对连续区间进行量化,有区间的max-min+1==cnt,其中cnt表示区间中数字的种类数。注意到,对于任意一个区间,恒有max-min+1>=cnt,我们对式子变形,有max-min-cnt>=-1。因此,如果我们维护每一个区间的max-min-cnt的最小值,当这个最小值为-1的时候,说明存在有连续区间,这个最小值出现的次数就是连续区间原创 2018-07-23 11:26:18 · 1597 阅读 · 0 评论 -
CodeForces 1000F One Occurrence( 离线处理+线段树解法)
大致题意:给你一个固定的数列a,然后q个询问,每个询问给出一个区间,问你区间内是否有恰好出现一次的数字,如果有输出任意一个,否则输出0。 这题主要方法就是仿照17年HDU多校有一道题的做法,HDU 6070。其实也只是用了其中的一个思想,也即用每一个数字把区间分段。对于每一个区间[1,r]中的最右边的一个数字i,我都可以记录一个pos[i],表示数字i在区间[1,r]中上一个出现的位置。这里最右边指的是,同一个数字i,可能在区间中出现多次,最后那次是我们想要的。求出了这个pos,我们可以发原创 2018-07-07 09:25:22 · 1137 阅读 · 0 评论 -
HDU 6305 2018 HDU多校赛第一场 RMQ Similar Sequence(笛卡尔树+手工栈)
大致题意:给你一个串A,定义RMQ相似串为,对任意区间[L,R],两个串RMQ所在位置相同。告诉你B串中每个元素服从于[0,1]上相互独立的均匀分布。B的权值定义为,当B与A串RMQ相似时,权值为所有元素之和,否则为0。现在问你B串的期望权值是多少。首先,看到这种RMQ然后两个串要相似的,很容易想到用笛卡尔树。所谓笛卡尔树,就是说,对于一个区间,我选择RMQ作为根,然后把区间分为两部分。这两部分再次分别用RMQ作为根继续划分,直到划分到单位区间。这题的话求一个期望,显然只需要关心那些权值不为0的。B与A串R原创 2018-07-25 00:08:08 · 546 阅读 · 0 评论 -
CodeForce 916E Jamie and Tree(线段树+分类讨论)
大致题意:给你一棵树,每个节点上面有一个权值。然后有三种询问:1、换根;2、把点x、y在现有树情况下的LCA的子树的所有点权增加一个值;3、求某个节点在现有树情况下的点权和。 很显然的一个线段树经典题目,首先求所有点的dfs序,然后根据dfs序建立线段树,可以动态维护子树的权值和。但是这题的关键在于换根。因为换根之后树的形态发生了改变,对应的子树情况也会发生改变,不能简单的用初始情况下的dfs序。但是我们显然也不能真的去换根。 我们现在重新考虑一下换根之后,对于2和3操作原创 2018-04-16 20:45:27 · 446 阅读 · 0 评论 -
BZOJ 2555 Substring(后缀自动机+LCT子树维护)
查找一个字符串在另一个字符串中的出现次数,这是一个很简单的问题。用很多的数据结构的可以解决。但是如果遇到动态的问题就不是那么好解决了。本题要求支持强制在线的增加与查询,纵观字符串的数据结构,只能是后缀自动机了。 后缀自动机本身加入字符的时候是一个个加入的,在加入的同时本身动态的可以维护parent和len等数据。对于后缀自动机来说,求一个字符串在原串中出现次数,还是和parent树的性质有关。根据parent指针的含义,parent表示的状态是当前状态的后缀,反过来当前状态的串就是paren原创 2018-03-23 08:58:39 · 466 阅读 · 0 评论 -
BZOJ 3110 [Zjoi2013]K大数查询(整体二分+树状数组)
其实呢,这题和之前写过的那个动态区间第K大很类似,只不过那个是修改,而这个是插入,但是同样都可以用线段树套Treap来实现。但是今天要说的是另外一种更加巧妙的分治方法,使得编程复杂度大幅下降——整体二分。 首先,我们知道,如果仅仅只是询问区间第K大,我们用的是二分答案。具体做法是二分一个数字,然后看区间内有多少个数字比他大,如果恰好有K-1个,那么枚举到的这个数字就是区间第K大。对于这道题目,我们同样也可以运用这种思想,只不过我们还要把这个所有的操作也和这个二分答案的过程一起做,所以顾名思义原创 2017-12-03 11:01:23 · 565 阅读 · 0 评论 -
第九次多校赛总结+CSU 1914+CSU 1921加强版解法
应该是2017年上半年的最后的一场多校赛了,真的挺想留下一个美好的回忆,但是无奈力不从心…… 从一开始就是,水题疯狂卡,然后题目做法没有弄清楚,就去敲模板……记得1921那题一开始没想清楚,先是打了一个树状数组,后来发现不对打了个线段树,最后发现直接暴力就可以过…… 水题过后就是一般的题目,然而不知道状态不好还是什么,很容易看出来的解法当时却没有想到,贪心和简单的数据结构的应用都没有做出来。还一直在抱怨原创题出的奇怪……其实这些都只能怪自己最近太水了。我承认是我的问题,数据结原创 2017-05-08 18:13:35 · 421 阅读 · 0 评论 -
NEU 1704 三维偏序(CDQ分治+树状数组)
经典的三维偏序问题,cdq分治同样也是经典的做法。 不考虑这种方法的话,我们可以先对所有的数字按照x坐标排序,然后按顺序把另外两个坐标添加进二维树状数组里面,每次查询它前面的数字个数即可。然而这里总共有100000个数字,开二维树状数组即使在离散化的情况下,也会爆内存,于是貌似只能用CDQ分治。 首先当然的,对x进行排序,然后为了分治的方便,就直接把x坐标离散化。然后直接进入分治,由于这题的cdq分治在单位区间的时候不需要进行什么修改,所以我们大可以先分治两个小部分,再处理大原创 2017-12-02 19:46:58 · 602 阅读 · 0 评论 -
CodeForces 848C Goodbye Souvenir(CDQ分治+平衡树/set+树状数组)
再度加深对CDQ分治的理解。大致题意:给你一个数字序列,然后有两种操作。一是修改,把某个位置的数字改成另外一个数字;二是求一个区间[l,r]中所有同类数字的最大跨度和,即如样例所示。 首先,对于这个同类数字中的最大跨度和,对于每一个数字可以按照套路,分成所有前后相邻两个同类数字的距离和。即1、2、1、3、1、2、3对于数字1的最大跨度,我们可以写成(3-1)+(5-3)=4,也样子相当于只需要维护前后两个相邻的数字即可。然后,我们考虑如何对于每个数字维护这个前后关系,支持删除然后又支持修改,原创 2017-12-14 20:46:56 · 469 阅读 · 0 评论 -
HDU 4691 Front compression(后缀数组+线段树/ST表)
大致题意,就是把一些字符串压缩,如果第i个子串与第i-1个有前缀相同的,那么可以表示为 x string 的形式,即lcp长度加上不同部分。现在,问你这样子压缩之后和压缩之前各有多少个字符(空格和换行符也要算上)。 根据一个简单的定理,这个在求height数组的时候貌似有些资料提到过,lcp(i,j)=min(h[k] | i<k<=j),即排名第i和第j的两个后缀,他们的lcp为二者的左开右闭区间的height[Rank[]]数组的最小值。有N个这样的子串,我们只需要做N次这样的区间最小值即可。而求区间最原创 2018-03-01 20:38:04 · 346 阅读 · 0 评论 -
HDU 6194 String ACM/ICPC 2017 Shenyang Online(后缀数组+容斥原理+线段树/ST)
据说这题是另一道SPOJ的一道后缀自动机的弱化版,好腻害的样子……这里用后缀数组解。 大致题意,给你一个字符串,然后问你在这个字符串中,恰好出现k次的不同子串有多少个(可以相互重叠)。 首先明确所有后缀数组题目都很重要的一点,即所有子串都是某个后缀的前缀,大部分都可以转化为lcp的问题。然后我之前在POJ上做了一道题,没有写博客,是求一个字符串中最长的出现至少k次的子串的长度(POJ 3261)。这两道题目类似,在求至少k次的时候用的是同样的方法。 对于这个出原创 2018-03-03 10:52:36 · 288 阅读 · 0 评论 -
Link Cut Tree 初探(模板)
之前说了Splay Tree 和 树链剖分,其实都是为今天Link Cut Tree 做铺垫,在这里首先要膜拜鼻祖杨哲大牛orz…… 杨哲——《QTREE解法的一些研究》:点击打开链接 这个是官方论文的介绍。 我在学习的时候在网上看到,有人说Link Cut Tree其实是树链剖分+Splay,但是学完之后发现这个说法其实并不妥,首先还是一样介绍一下...原创 2017-02-05 19:02:11 · 1177 阅读 · 1 评论 -
Link Cut Tree 再探、总结
Link Cut Tree对我来说已经有点老生常谈了——目前为止理解的比较深的一种比较难的数据结构吧。 之前的初探以及次探已经基本阐明了LCT本身的功能和大部分的作用,在这里做一个简单点的回顾吧。 首先就是数据结构本身。LCT又叫做动态树,本身很像树链剖分+SplayTree,但是如其名,可以动态的变化。主要函数就是Access(expose)、Spla...原创 2018-03-23 00:31:51 · 368 阅读 · 0 评论 -
BZOJ 3238 差异(后缀自动机+树上统计)
中文题,题意自己看看吧。 看到表达式,难求的主要是lcp,任意两个后缀的lcp。即使用上后缀数组求这么多个lcp也是要超时的。但是这里如果用后缀自动机的性质,会好很多。 我们之前在介绍后缀自动机的时候说过,parent树表示父亲是儿子最长的一个后缀。那么,对于最长公共后缀的时候,两个字符串对应状态的LCA的len值,就是我们最长公共后缀的长度。即两个字符串往上走,都是走到他们的后缀,然后越往上长度越短,所以说第一个相同后缀一定是最长的,对应长度就是LCA的len。对于本题的原创 2018-03-22 08:46:05 · 334 阅读 · 0 评论 -
CodeForces 888G Xor-MST(Sollin MST+Trie)
标题都已经很明显了,一个最小生成树,只不过是用xor做。 通常来说xor的题目,要么是贪心,要么是用Trie去做,而这道题,显然要用到Trie。但是我们又如何做到求最小生成树呢?这里,我们发现求最小生成树有一个非常少见的算法——Sollin(Boruvka)算法。具体来说,就是一开始把每个点看成独立的连通分量,对于每个连通分量,每次操作找与其最近的连通分量合并,一直到只剩下一个连通分量为止。这样子最坏的情况是每次只减少一半的连通分量数目,最好的情况就直接和Prim算法相同。具体实现起来,可能原创 2018-02-11 18:57:58 · 491 阅读 · 0 评论 -
HDU 6278 Just h -index(可持久化线段树)
大致题意:给你一个序列,然后给你很多个询问,每个询问让你求给定区间[l,r]中,最大的h,使得区间中大于等于h的数字不小于h。湘潭邀请赛现场的题目。当时听了题目,没仔细想别的方法,就用莫队算法硬刚,运气不错算是过了。现在看来,这是一道可持久化线段树的好题。首先,这里的数字都是1~n之间的,所以我们可以按照数字的大小插入线段树,每个点维护对应数字出现的次数和对应区间的数字和。然后,因为有区间操作,所以加上可持久化操作,每一次都是右端点对应线段树减去左端点对应线段树。那么问题的关键就是怎么求这个最大的h。这个h原创 2018-07-25 09:44:57 · 567 阅读 · 0 评论 -
KD-Tree 初学(模板+HDU 4347)
KD_Tree的话,一年半以前,那时候翻我们学校给的模板翻到看了,上面写的"by edward_mj"。这个ID浙大的人应该很熟悉,13-14年连续两年带队打进WF。这里我可以吹一下,edward_mj可是和我同一个高中毕业的哟~当时也问了一下学长,学长说KD树是他写的最溜的一个数据结构之一。 直到这几天我才有时间来学学KD树。所谓KD树,顾名思义k-dimensio...原创 2018-07-07 17:05:26 · 2275 阅读 · 6 评论 -
CodeForces 1096F Inversion Expection(树状数组 + DP + 组合计数)
好久没有做一道这么对胃口的题了……大致题意:给出一个1..n的全排列,但是其中有些数字被替换成了-1。我们设给出数列中-1的个数为x,那么原来的全排列就有x!种,而且告诉你取这x!种每一种的概率相等,现在问你原排列的逆序对的期望是多少。很显然,这个数列分为两个部分,一个部分是已经给出的正整数,另一部分是-1。那么相应的,逆序对可以分为三个部分,一个是正整数部分内部逆序对...原创 2018-12-29 16:40:51 · 468 阅读 · 0 评论 -
牛客练习赛34 F little w and Discretization(可持久化线段树)
猛然发现,过这道题竟然已经是10天前的事情了……题意大概就是说给你一个序列,每次询问把一个区间的数字离散化,问离散化之后与原本数字不相同的数字个数有多少个。这里有很多个询问,每个询问之间相互独立。既然是要离散化,我们肯定不能到询问的时候再离散化,肯定是在做所有询问之前,先自己离散化一下。我们考虑一个数字离散化之后与它本身的区别,由于这里说了数列里面的数字都是1~1e...原创 2018-12-25 09:43:05 · 551 阅读 · 0 评论 -
CodeForces 1110F Nearest Leaf(离线处理 + 线段树)
大致题意:给你一棵n个节点的带有边权的树,给你q个询问。每个询问给出一个点x和一个区间[l,r],问在dfs序在这个区间的点中,距离x最近的叶子节点距离x的距离是多少。首先,我们考虑,如果每个询问的点x都是根,那么我们每次寻找一个距离最近的叶子节点的距离,相当于在这个区间中找叶子节点的最小值。因此,很自然而然的,我们可以把根距离每个叶子节点的距离放到线段树里面,那么...原创 2019-02-09 15:54:56 · 469 阅读 · 0 评论 -
CodeForces 1111E Tree(LCA + DP +树状数组)
大致题意:给你一棵包含n个节点的无根树,然后q个询问,每个询问给出一系列点和m、r。表示问你,把根设置为r的情况下,把给定点分为至多m部分,要求每一部分至少一个给定点,且一个部分中不能出现两个给定点一个点是另一个点的祖先,问划分的方案数。还是一样,我们先简化问题,如果这时一个有根树,然后每次是固定根去询问。那么,令dp[i][j]表示只考虑给定点的前i个点,分为j个部分...原创 2019-02-09 16:40:53 · 550 阅读 · 2 评论 -
CodeForces 1114F Please, another Queries on Array?(线段树 + 状态压缩 + 数论)
大致题意:给你一长度为n的序列,和q个操作。一个是区间乘以某个数字,另一个是查询区间积的欧拉函数对1e9+7取模的结果。出了n和q,这里所有出现的数字都是小于300的。这里如果直接做,显然是不行的,因为欧拉函数虽然具有积性,但是并不能够取模,意味着不能直接保存区间积。同时,欧拉函数不具有完全积性,当gcd不为1的时候,不是直接相乘。但是这里有一个很重要的条件,即出现的每个数...原创 2019-02-13 11:15:28 · 323 阅读 · 0 评论 -
CodeForces 1140F Extending Set of Points(线段树 + 并查集 + DFS)
大致题意:每个时刻往集合S里面添加或者删除一个点,然后每个时刻输出集合E(S)的大小。所谓E(S)就是对S进行拓展,如果S中存在(x1,y1)(x2,y2)(x1,y2)那么把(x2,y1)加入集合,一直到不能新加入点为止。我们仔细分析这个点加入的条件,很容易可以发现,对于一个点(x,y),相当于把第x行和第y列给合并。最后的答案就是每个连通块内的行数与列数的乘积和。所以我...原创 2019-04-04 08:39:19 · 504 阅读 · 0 评论 -
CodeForces 1132G Greedy Subsequences(线段树 + LIS)
大致题意:求所有长度为K的连续子区间的最长上升子串长度。我们知道,朴素的LIS问题有O(nlogn)的解法,但是如果有很多个区间,显然也是做不了的。这里我们学习到了一种解决LIS问题的新姿势。我们考虑每一个数字a[i],令nxt[i]表示它右边第一个比它大的数字的位置。这样每一个节点要么只有一个nxt[i],要么没有nxt[i]。如果我们把每一个i与nxt[i]连一条边...原创 2019-04-11 10:20:50 · 335 阅读 · 0 评论 -
HDU 6521 Party(线段树 + 思维)
大致题意:有n个人,一开始相互不认识。他们要去参加party,每次参加的人是编号在区间[l,r]内的人。参加完一次party之后,这区间内的人就会相互认识。现在问你,每次参加party的时候,有多少对人会新认识。首先,在参加这么多次party的过程中,每个人认识的人的编号显然是一个连续的区间。于是,我们就可以用L[i]和R[i]表示第i个人认识的人的区间左右端点。每次在参加...原创 2019-04-19 23:52:48 · 821 阅读 · 10 评论 -
2019牛客多校赛 第一场 I题 Points Division (DP + 线段树)
大致题意:给你n个点,第i个点在的位置为(xi,yi),有两个属性值(ai,bi)。现在让你把这n个点划分为A和B两个部分,使得最后不存在i∈A和j∈B,使得xi>=xj且yi<=yj。然后对于所有的划分方法,找到并输出 首先那个划...原创 2019-07-19 12:59:40 · 953 阅读 · 26 评论 -
2019牛客多校赛 第八场 H How Many Schemes(AC自动机 + 矩阵 + 向量 + 树链剖分 + 线段树)
大致题意:给你一棵树,每条边上有一个字符串,然后有一些模式串。现在给你一个询问<u,v>,问你u到v的路径上,每个条边任意选择一个字符,最后按照顺序组成一个字符串,最后的字符串包括至少一个模式串的方案有多少种。看起来很难的样子,写起来其实很复杂,但是理解清楚了其实思路也不太难。首先,既然涉及到匹配问题,而且是多个模式串,很容易想到对模式串建立AC自动机。...原创 2019-08-15 20:57:54 · 346 阅读 · 0 评论 -
计蒜客 2018ICPC徐州站/gym 102012G Rikka with Intersection(组合计数 + 树链剖分 + 树状数组)
大致题意:给你一个包含n个点的树和m条路径。现在让你从这m条路径中选择k条路,使得这k条路径一定有至少一个公共交点,问选出这k条路径的方案数是多少。最朴素的想法就是,每次查看一个点的贡献,也就是枚举这个公共点,然后看有多少个路径经过这个点,组合数求一下即可。但是这个错误也是很明显的,因为有可能同样一批路径,会有超过一个的公共点,这样的话就会重复计算。显然,如果有多个公共点的话,...原创 2018-12-02 22:47:15 · 889 阅读 · 0 评论 -
牛客练习赛31 F 瑟班守护者莎利雅与护教军(推导 + 线段树)
一道算是挺难想的线段树。需要维护两个数组,一个d和一个f。f的定义参见体题面,前后最大值中最小的,再与自己的d取一个大的。然后有三种操作,1是求f的和;2是求区间[l,r]中,有多少个f的数值大于给定的数字v;3是修改某一个位置的d的值,使其增加v。在这里,f随着d的数值而变化,但是这个变化的关系没有什么直观的联系。下面我们仔细考虑一下,这两个到底有什么关系。 ...原创 2018-11-17 16:52:35 · 312 阅读 · 0 评论 -
HDU 6315 2018HDU多校赛第二场 Naive Operations(线段树+树状数组)
大致题意:初始的时候给你序列bi,然后ai初始为0。现在又两种操作add l r 和query l r。add是把a中区间[l,r]加一,query是让你求∑⌊ai/bi⌋,即区间内ai数值除以bi向下取整。个人最擅长做的题系列~现场50min时A题O(∩_∩)O……首先说明一下,这里用普通的线段树维护区间和之后再去除法,什么通分什么的都不行。因为这里的次序是先向下取整再进行求和。所以得考虑用其他的方法。仔细观察,我们可以发现,只有当ai的数值增加了bi的时候,才会对最后的结果产生贡献。因此,我们完全可以利原创 2018-07-25 19:23:17 · 437 阅读 · 2 评论 -
HDU 6368 2018HDU多校赛 第六场 Variance-MST(LCT+kruskal)
大致题意:给你很多条边,每条边有边权,现在让你找到一个方差最小的生成树,即最小方差生成树。看到这题,我们首先回忆一下很久之前做过的一道,求最小极差生成树的题目 CSU 1845 。这套题目里面用到的主要思路就是,最小极差肯定是连续的一段,然后我就按照边的权值大小排序,每次看边是否可以直接加入,如果可以则直接加入,否则在加入这条边之后的环中寻找一条权值最小的边删掉。这样所有的边遍历一遍,中间过程中的极差最小就是我们的解。接着,我们考虑这道题目,显然,这题的方差和极差是有关系的,因为方差越小意味着样本之间越接近原创 2018-08-10 11:25:02 · 863 阅读 · 0 评论 -
HDU 6338 2018HDU多校赛 第四场 Depth-First Search(组合数学+平衡树/pbds)
大致题意:给你一个dfs序列B和一棵树,现在让你在这个树上随机选择一个点,然后按照随机的dfs顺序走。问你最后能走出几个dfs序列,是得该dfs序列字典序小于给定的dfs序B。首先,我们考虑一棵树有根树他的dfs序有多少种。我们可以这么考虑,对于任意点x,我都可以任意的向它的所有儿子走去,那么就会对应 种方法。我们注意到,除了根之外,所有的点的儿子的数目等于其度数减一,那么,我们便可以得出一棵有根树的dfs序列为:。进一步,我们可以令 ,那么对于不同的根,其对应树的方案数就是 res*deg[root],原创 2018-08-02 20:47:27 · 615 阅读 · 0 评论