11 2022 档案
摘要:简单倍增。 前置:树上倍增 k 级祖先。 注意题目无修改,所以对于询问距离,直接预处理出每个点到根的距离,然后相加减去两倍 LCA 即可,非常套路。 对于第二位,先求出 u,vu,vu,v 的 LCA,先看 u→lcau \rightarrow lcau→lca 这条路径上经过的点数是否 ≥k\ge
阅读全文
摘要:题意 给定 H×WH \times WH×W 的一个矩形,矩形中每个点有一个不超过 nnn 的正整数。 你需要对于 0≤i≤H−h,0≤j≤W−w0 \leq i \leq H-h, 0\leq j \leq W-w0≤i≤H−h,0≤j≤W−w 的所有 (i,j)(i,j)(i,j),将 k<i≤
阅读全文
摘要:考虑操作逆序,那么对于操作 111,加法变成减法。 问题在于对于操作二,如何找到答案。 显然我们可以发现,经过这次操作二后,序列中的每个数都 ≥\geq≥ 这次操作二的答案,于是操作二的答案必然 ≤\leq≤ 这个操作二的区间最小值。 我们可以发现,答案应取区间最小值,因为假如答案可以小于区间最小值
阅读全文
摘要:考虑求排名怎么做。 一种空间比较优秀的做法就是树状数组加二分找排名,即值域树状数组上二分。 然后删除即在树状数组上将数的值 −1-1−1 即可。 复杂度应该是 O(nlogn+qlog2n)O(n \log n + q \log^2 n)O(nlogn+qlog2n)。常数有点大,加了快读卡一卡
阅读全文
摘要:考虑一种特殊情况:即原序列 aaa 中存在一个 111,例如 a=[3,4,5,6,1]a=[3,4,5,6,1]a=[3,4,5,6,1],显然最优的是把 111 和相邻的进行操作,只需要 n−1n-1n−1 次即可。 若有多个 111,令 c=∑i=1n[ai==1]c = \sum \limi
阅读全文
摘要:考虑操作有删边但没有恢复边的操作,很容易想到离线后逆序操作的套路。 逆序后操作即为只有加边没有删边了,并查集维护即可。 但是注意到题目要求点权和,所以带权并查集维护,修改权值也可以轻松做,即在父亲的点上减去本身的贡献加上新的贡献即可。 #include <iostream> #include <cs
阅读全文
摘要:先考虑暴力做法。 对于深度 ≥x\geq x≥x 的点变成黄色,相当于对于每一个深度为 xxx 的点,将以它为根的子树中每个点都变成黄色。 但是显然深度为 xxx 的结点的数量是 O(n)O(n)O(n) 级别的,每次用线段树维护区间覆盖区间求和的理论复杂度上界是 O(mnlogn)O(mn\lo
阅读全文
摘要:容易想的题目。 考虑两数异或为 111 的性质。 结论:x⊕(x+1)=1x \oplus (x+1)=1x⊕(x+1)=1。 考虑两数 x,yx,yx,y,将每一个用二进制表示出,显然只有 20=12^0=120=1,其余 222 的幂都不可能为 111,即两数异或为 111 当且仅当这两个数二进
阅读全文
摘要:考虑对 nnn 进行二进制拆分,最终可以表示成 n=2a1+2a2+⋯2apn =2^{a_1} + 2^{a_2} + \cdots 2^{a_p}n=2a1+2a2+⋯2ap,ai≥0(1≤i≤p)a_i \geq 0(1 \leq i \leq p)ai≥0(1≤i≤p)。 当 p>k
阅读全文
摘要:考虑将 0 权值设为 −1-1−1,将 1 权值设为 111。 题目即求一段最长子串使得这一串的权值和为 000。 考虑 pip_ipi 为权值,其中 1≤i≤n1 \leq i \leq n1≤i≤n,前缀和为 si=∑j=1ipis_i = \sum \limits_{j=1}^i p_isi
阅读全文
摘要:与最小乘积生成树类似。 考虑维护左下凸壳上的点,每次重设边权然后求最小匹配。 具体做法和上面的链接类似,只不过最小生成树部分变成了最小匹配。 代码使用费用流: #include <iostream> #include <cstdio> #include <algorithm> #include <c
阅读全文