随笔分类 - 题解
摘要:提供一个复杂度与 kkk 无关的算法。 容易发现的是,当 x<0x<0x<0 时,我们令 x←−xx \leftarrow -xx←−x, k←n−kk \leftarrow n-kk←n−k,与原题等价。 所以下文我们默认 x≥0x \geq 0x≥0。 我们先考虑最终选择所有长度 <k<k<k
阅读全文
摘要:先考虑第一问。 显然构造应该为 l,2×l,4×l,⋯ ,2k×ll, 2 \times l, 4 \times l, \cdots, 2^k \times ll,2×l,4×l,⋯,2k×l,其中 2k×l<=r2^k \times l <= r2k×l<=r 且 2k+1×l>r2^{k+1}
阅读全文
摘要:有一个很奇怪的做法。 我们令 fif_ifi 表示从 iii 出发能往外扩散的最多步数,初始时,fai=bif_{a_i} = b_ifai=bi,接着类似最短路进行松弛,于是我写了一个 SPFA,然后 TLE 了几个点。 接着我们可以用 SLF 优化,然而还是被卡掉了一个点,这里还有一个有
阅读全文
摘要:简单并查集。 考虑先对图进行并查集,令 fif_ifi 表示 iii 号节点在并查集中用 getfa 找到的结果。 对于添加边 u↔vu \leftrightarrow vu↔v,uuu 和 vvv 分别所在的连通块中的每一对点都会变得联通,也就是对于所有 x,y(fx=fu,fy=fv)x,y(
阅读全文
摘要:考虑 DP。 令 fi,0/1f_{i,0/1}fi,0/1 表示当前打完了第 iii 个字母,且 Capslock 现在处于开启或关闭时的代价最小值。 于是可以进行线性 DP。 #include <bits/stdc++.h> using namespace std; const int N =
阅读全文
摘要:直接模拟即可。 #include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5; int dx[] = { 0, 0, -1, 1 }; int dy[] = { -1, 1, 0, 0 }; int n, m, h, k; s
阅读全文
摘要:比较经典的问题。 考虑根号分治,令 b=⌊n⌋b=\lfloor\sqrt n\rfloorb=⌊n⌋。对于 k≥bk \geq bk≥b,直接暴力,复杂度是 O(n)O(\sqrt n)O(n) 的。对于 k<bk < bk<b,考虑预处理 fi,jf_{i,j}fi,j 表示 t=i,k=
阅读全文
摘要:非常套路的建图最短路。 首先有一个非常好思考的做法,对于 i,ji,ji,j,如果 iii 的集合和 jjj 的集合有交集,那么连 i↔ji \leftrightarrow ji↔j 的边。 但这样建图复杂度已经达到了 O(n2)O(n^2)O(n2) 以上,无法承受。 于是我们考虑转化。两个集合有
阅读全文
摘要:题意 有一张 nnn 个点,初始时没有边的无向图。 你要维护 qqq 次操作,每次操作可能是下面的其中一个: 添加一条 uuu 到 vvv 的边。 删除与 uuu 相连的所有边。 每次操作后,输出孤立点数量。 解法 发现添加只会添加一条边,而删除则可能删除许多。一条边如果被加入一次,那么最多只会被删
阅读全文
摘要:容易发现我们可以先对两个序列排序。 依次枚举 aia_iai,那么另一个数应该 xxx 应该满足 x∈[ai−D,ai+D]x \in [a_i - D, a_i + D]x∈[ai−D,ai+D]。因此我们可以二分在这个区间的最大值 ppp,那么这个贡献就是 ai+pa_i+pai+p,最
阅读全文
摘要:由于 n≤8n\leq 8n≤8,所以可以考虑 O(n!)O(n!)O(n!) 暴力枚举全排列,并且依次计算是否满足题意要求。 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include
阅读全文
摘要:经典树套树。 考虑删除 xxx,我们找到 xxx 的位置 ppp,那么删除 xxx 后,所有在 1∼p−11 \sim p-11∼p−1 中且大于 xxx 的逆序对都没了,同时在 p+1∼np+1 \sim np+1∼n 中小于 xxx 的逆序对都没了。可以使用 CDQ,KD-TREE,分块,树套树
阅读全文
摘要:直接贪心 先忽略 ?\texttt{?}?,算出一个值 vvv。 如果 n<vn<vn<v,那么答案就是 −1-1−1。 否则 n←n−vn \leftarrow n-vn←n−v,然后按位贪心,依次选即可。 #include <bits/stdc++.h> using namespace std;
阅读全文
摘要:直接做是难的,发现这个东西似乎可以矩阵优化。 可以发现 [a+bb]=[ab]×[1011]\begin{bmatrix} a+b&b \end{bmatrix} = \begin{bmatrix} a & b \end{bmatrix} \times \begin{bmatrix} 1 & 0 \
阅读全文
摘要:自定义结构体维护平衡树即可,并不需要哈希。 我们对于每个结构体维护名字、分数和插入时的编号。先按分数,后按插入编号重载运算符即可。 根据题意,我们要支持插入,求排名,按照排名求值以及删除操作。因为如果一个人的分数被更新,我们要在平衡树中修改它,即先删除后插入。 由于需要删除操作,所以需要写前驱操作,
阅读全文
摘要:容易发现对于插入 xxx,如果我们找到了 xxx 的前驱 ppp 和后继 nnn,那么 xxx 一定位于 ppp 或 nnn 的某个儿子上。 仔细观察,发现 xxx 会位于 ppp 和 nnn 中深度较大的一个的儿子上。 于是我们依次插入每个数,查前驱后继,并且更新深度。 然后可以直接用 set 做
阅读全文
摘要:可以用 SAM 来做,只不过空间常数稍大。 考虑建出后缀自动机后,用 fafafa 树维护 Endpos\text{Endpos}Endpos 集合大小即可,非常经典的用 SAM 做的问题。 #include <bits/stdc++.h> using namespace std; const in
阅读全文
摘要:先考虑对图黑白染色,并且设 SSS 和 TTT 分别为源点和汇点。容易发现,四联通的两个点,肯定是一个黑一个白。 我们对于所有黑点 (i,j)(i,j)(i,j),我们令 u=(i−1)×m+ju=(i-1) \times m + ju=(i−1)×m+j,从 SSS 到 uuu 连一条容量为 ai
阅读全文
摘要:先考虑能否逃出。 我们不妨设删去的边的两点编号为 u,vu,vu,v,其中 uuu 是 vvv 的父亲。 容易发现当且仅当 RRR 在 vvv 的子树中时无法逃出,即 RRR 和 vvv 的 LCA 为 vvv。可以通过树剖等处理。 我们假设不能逃出,那么需要考虑能否到商店。因为已经无法逃出,那么
阅读全文
摘要:考虑建出圆方树。 对于任意两个点,其路径中必须要经过的点就是这两个点对应的圆方树中点的路径之间圆点数量。也就是割点数量。 于是 LCA 处理即可。 #include <iostream> #include <cstdio> #include <algorithm> #include <cmath>
阅读全文

浙公网安备 33010602011771号