随笔分类 - 题解
摘要:容易发现当 n≤1n \leq 1n≤1 时,由于 nnn 在 int 范围内,所以 p<31p < 31p<31。考虑从小到大枚举 ppp 并二分 np\sqrt [p]{n}pn,判断是否是整数即可。 #include <iostream> #include <cstdio> #include
阅读全文
摘要:这里介绍 Xor-Hash 的树哈希换根做法。 令 fif_ifi 为设树根为 111,以 iii 为根的子树的哈希值,有 fi=1+∑j∈sonuF(fj)f_i = 1 + \sum \limits_{j \in son_u} F(f_j)fi=1+j∈sonu∑F(fj),FFF 是
阅读全文
摘要:如果是有根树,我们只需要从根开始树哈希即可。如果是无根树,一种方案是,依次选取每个点作为根,但复杂度无法接受。当然可以换根 DP,但有一个比较聪明的方法。 找到两棵树的重心进行树哈希。注意重心最多有两个,所以要进行两次树哈希,对哈希值进行对比。 令 fif_ifi 为以 iii 为根的子树的哈希值
阅读全文
摘要:有趣的题。 首先第一个和第二个条件可以暴力枚举,复杂度 O(n2)O(n^2)O(n2)。 可以发现如果满足了第一个和第二个条件,这个矩阵其实就是一个无向完全图的邻接矩阵,ai,ja_{i,j}ai,j 表示 i↔ji \leftrightarrow ji↔j 的边权。 接着思考第三个。 我们发现
阅读全文
摘要:考虑拆点,每个点对 (x,y)(x,y)(x,y) 拆成入点 uuu 和出点 vvv。连 x→cap=+∞,cost=0yx \xrightarrow{cap=+\infty,cost=0} yxcap=+∞,cost=0y。如果这个地方有石头,再连一条 x→cap=1,cost=1yx \xri
阅读全文
摘要:简单费用流。 考虑每个点 (x,y)(x,y)(x,y) 转化成 (x−1)×(p+1)+y+16(x-1) \times (p+1) + y+16(x−1)×(p+1)+y+16。加上 161616 是为了避免结果为负数或 000。 题目限制只能往上或往右,于是对于每个点 uuu,找到上边和右边的
阅读全文
摘要:考虑每行一个点,每列一个点。源点 SSS 向每行连边,每列向汇点 TTT 连边,容量都是 111。 对于每个棋子,新开两个点,一个是行对应的点 xxx,另一个是列对应的 yyy。 发现其行可以在 [Ai,Ci][A_i,C_i][Ai,Ci] 中任取,列可在 [Bi,Di][B_i,D_i][B
阅读全文
摘要:首先发现答案可以二分,考虑如何判定。 首先用最短路算法跑全源最短路预处理 di,jd_{i,j}di,j 表示 iii 到 jjj 最短路。用 Floyd 做复杂度是 O(n3)O(n^3)O(n3) 的,若使用 Dijkstra 算法则是 O(nmlogm)O(nm \log m)O(nmlo
阅读全文
摘要:莫队板子。若 iii 出现 cic_ici 次,我们能要求的是 ∑i∈N⌊ci2⌋\sum \limits_{i \in \mathbb{N}} \lfloor \frac{c_i}{2} \rfloori∈N∑⌊2ci⌋。 简单莫队维护即可,复杂度 O(qn)O(q \sqrt n)O(q
阅读全文
摘要:有趣的网络流。 首先,除了 222,所有质数都是奇数,所以只能被表示成两个奇偶性不同的数的和。所以我们先抛开 222 不谈。 如果抛开 222,意味着原序列没有 111。若是这样,我们可以直接最大流解决,具体是这样: 考虑对于 ai+aja_i+a_jai+aj 为质数且 aia_iai 是奇
阅读全文
摘要:首先可以二分答案,接着考虑如何写 check。 我们发现尽管我们二分了最大和最小的差,但我们仍然无法确定这个区间,这是因为最小值不固定。 由于 B≤20B \leq 20B≤20,所以我们可以枚举最小值,求出对应区间。也就是说,每头牛去的牛棚在 [i,i+x−1][i,i+x-1][i,i+x−1]
阅读全文
摘要:首先可以发现可以二分答案。接着考虑如何 check。 假设二分当前距离最大值为 xxx,显然对于点对 (i,j)(i,j)(i,j),当 dis(i,j)≤xdis(i,j) \leq xdis(i,j)≤x 时,iii 的所有奶牛可以到 jjj 点避雨。可以最短路预处理 disdisdis。然而题
阅读全文
摘要:考虑根号分治。 若 kkk 固定,怎么做? 容易发现我们可以从树的叶子节点开始往上走,每走到一条合法的链就拼起来,贪心即可,复杂度 O(n)O(n)O(n)。 此外,我们还发现,令 ansians_iansi 为 k=ik=ik=i 时的答案,那么由于每条链不相交,所以 ansi≤⌊nk⌋ans_
阅读全文
摘要:容易发现答案为 ∑i=1b[gcd(i,n)=1]−∑i=1a−1[gcd(i,n)=1]\sum \limits_{i=1}^b [\gcd(i,n)=1]-\sum \limits_{i=1}^{a-1} [\gcd(i,n)=1]i=1∑b[gcd(i,n)=1]−i=1∑a−1[gc
阅读全文
摘要:有趣题。 容易发现答案可以二分,重点在于怎么写 check。 我们假设现在二分的是 xxx,我们要判断若对于每条边,只能经过 xxx 次,kkk 个点是否可以全部到达 111。容易发现这个东西可以转化为网络流,从源点 SSS 向 kkk 个特殊点连容量为 111 的边,原图上每条边的容量为 xxx。
阅读全文
摘要:容易发现整个序列和的绝对值 ≤1014\leq 10^{14}≤1014,令其为 VVV。 那么当 k≠±1k \neq \pm 1k=±1 时,kkk 的非负整数幂只有 O(logkV)=O(logV)O(\log_k V) = O(\log V)O(logkV)=O(logV) 个不同的
阅读全文
摘要:考虑离线。 我们从小到大枚举 RRR,考虑令 sis_isi 为 l≤il \leq il≤i,且 r∈[l,R]r \in [l, R]r∈[l,R] 的答案。可以发现对于询问 l,rl,rl,r,答案即为 sr−sl−1s_r - s_{l-1}sr−sl−1。 接着我们考虑当 R←R+1
阅读全文
摘要:容易发现的是,当左端点 lll 确定时,r∈[l,n]r \in [l,n]r∈[l,n],那么 gcdi=lrai\gcd \limits_{i=l}^r a_ii=lgcdrai 的不同数量是 O(logV)O(\log V)O(logV) 的级别。 原因是,每次 gcd\gcdgcd
阅读全文
摘要:由于 m≤5m \leq 5m≤5,所以非空子序列只有 2m−1≤312^m-1 \leq 312m−1≤31 个,直接全部找出来并且放在子序列自动机上跑一下就好了。然后值域很大,朴素的用 nxt 构建子序列自动机的复杂度为 O(nv)O(nv)O(nv),vvv 是值域。这样复杂度错误,所以 ve
阅读全文
摘要:我们建立出序列自动机后,令 fx,y,zf_{x,y,z}fx,y,z 表示在三个子序列自动机分别到达 x,y,zx,y,zx,y,z 后,能往后走子序列的数量。 容易发现对于现在在 x,y,zx,y,zx,y,z 的三个点,我们只需要往外枚举 262626 个节点,并且记忆化即可。 #inclu
阅读全文

浙公网安备 33010602011771号