BY-SA 4.0(除特别声明或转载文章外)
[^&^](https://vjudge.net/problem/HDU-6702)
签到
array
因为数组中的值唯一,且在1到n的范围内,而询问的r和k也在1到n的范围内。 所以对于任意一个被操 作1修改过的值都不会成为询问的答案,而询问的结果也必然在k到n+1的范围内。 因为没有被修改过 值是唯一的,所以可以建立权值线段树,维护权值区间内的值所在下标的最大值。而询问则转化为不小 于k的值里面,下标超过r的最小权值是多少。 如何处理询问呢,一种较为暴力的解法是直接在线段树上 询问权值在k到n+1的范围内第一个下标超过r的权值是多少。但复杂度可能会被卡,需要减枝。 再加上 一个额外的判断就可以了,就是在递归查询完左子树内存不存在大于r的下标之后,如果不存在,则先 看一下右子树内的下标的最大值是否大于r。如果不大于r,则不必再进入右子树内查询,否则答案一定 在右子树内。在进左子树之前也利用同样的判断条件来判断是否有必要进入左子树,这样做可以保证单 次查询的复杂度是O(log n) 的。 而对于操作1,则等价于修改某个权值的下标为无穷大。操作复杂度也 是O(log n )的。 综上所述,得到了一个复杂度为O( m * log n )的在线算法,可以较快地通过此题。
K-th occurrence
涉及到子串之间的关系的大量查询不难想到后缀自动机/后缀树,这里给出一个后缀自动机的做法。 对串建后缀自动机,扒出parent树。 考虑将代表第个前缀的点权值设为 ,对于后缀自动机上某个点代表的所有字符串,这些串 在原串中的第 次出现位置(最后一个字符的下标)即为其在parent树的子树上第 大的权值。 在dfs序上建持久化线段树即将其转化为一个经典问题:静态区间第K大。 在parent树上建倍增数组即可在内找到自动机上代表某子串的点,以其为根进行子树询问即 可。
队友做的,待补。
Path
先把每条边以形式放进堆,堆按路径权值从小到大排序,然后每次取出堆顶,用v的出边扩展新的路径。但是一个点的出度可能会非常大(如菊花图),可以发现,将出边排序之后,每次只需要扩展当前点最小的出边,和扩展到当前点的边的下一条边即可。堆中需要记录当前结点,当前距离,上一节点距离,扩展到当前节点时下一条应该扩展的边。(注意,如果一次性扩展当前点连出去的所有权值相同的边,是会TLE的,实际上也是没有必要的。) 复杂度
huntian oy
队友做的,莫比乌斯反演。待补。
Shuffle Card
签到
花絮:我校十一队和四川大学校队代码被查重了(显然是误杀)…签到题查重简直了…
Windows Of CCPC
签到
Fishing Master
每条鱼都需要被抓上来并且煮足够的时间,而我们能在炖鱼的时候抓鱼,所以至少需要抓一条鱼的时间 和炖所有鱼的时间,也就是。要能在这个时间内就完成,则除了抓第一条鱼以外抓鱼的时 候锅里都必须在炖鱼(假设锅里的鱼一旦炖好就自动取出来),显然如果 都太小的时候这是不能做到 的,会有一些抓鱼的时间锅里没有在炖鱼,我们称锅里没有炖鱼的抓鱼时间为被浪费的时间,所以我们 的优化目标就是使被浪费的总时间最小,答案即为。 对于第条鱼,炖它的时候我们可以不浪费时间抓到条鱼,或者浪费的时间抓到条鱼。所以如果,则可以不浪费时间完成任务;如果,则差条鱼就选炖前大的鱼的时候浪费时间多抓一条鱼。
Kaguya
表示从号点开始bfs到第步, 用了白点个, 黑点个, 且第层个数正好为的期望。 通过枚举新层的节点个数进行转移。 复杂度
Touma Kazusa’s function
sakura
![]() |
![]() |