05 2024 档案
摘要:思路 不难发现,对于一个 lv>2lv>2lv>2 的树而言,左右儿子是 lv−2lv-2lv−2 的,中间儿子是 lv−1lv-1lv−1 的,这里就放一个 lv=4lv=4lv=4 的图(手绘,不喜勿喷 qwq): 然后每隔三层,就会在根节点形成一个与子树的爪不重合的爪,所以状态转移方程如下:
阅读全文
摘要:思路 根据等差数列求和公式,1+3+5+⋯+(2n−1)=(2n−1+1)×n2=n2,2+4+6+⋯+2n=(2n+2)×n2=n×(n+1)1+3+5+\dots+(2n-1)=\frac{(2n-1+1)\times n}2=n^2,2+4+6+\dots+2n=\frac{(2n+2)\ti
阅读全文
摘要:思路 对矩阵进行 (i+j) mod 3(i+j)\bmod3(i+j)mod3 编号,只要改变其中一种颜色的所有 X 棋子就不会出现连续 333 个行列同色。 记得选最小的,最小的那个肯定 ≤⌊k3⌋\le\lfloor\frac k3\rfloor≤⌊3k⌋。 代码 # include <bi
阅读全文
摘要:提示 正难则反,可以总数减去无交集的部分; iii 与 jjj 无交集的条件是 rj<lir_j<l_irj<li 或 lj>ril_j>r_ilj>ri 二分是个好东西。 思路 上面基本已经说了大致思路。我们设 l,rl,rl,r 为原数组,L,RL,RL,R 也是原数组,但是单独排序了。
阅读全文
摘要:思路 首先 aia_iai 是第 ⌊ai−1n⌋\lfloor\frac{a_i-1}{n}\rfloor⌊nai−1⌋ 行第 (ai−1) mod n(a_i-1)\bmod n(ai−1)modn 列的(此处均为 000 开始),然后每次添加点肯定不用整个都判断,只需要判断更改的部分即可
阅读全文
摘要:思路 按照题目说的做就行。 对于每一个新进来的请求,先把完成时间比任务开始时间靠前的任务从队列里弹掉,然后判断队列里任务个数是否 ≤ti\le t_i≤ti(是 ≤\le≤ 不是 <<<,因为我们已经把正在工作的任务也放在队列里了),如果是,那就把结束时间累加上 did_idi 并塞进队列。注意
阅读全文
摘要:思路 首先这题要用最短路是显然的,但是边权不固定(但对 dijkstra 过程没影响,因为边权没有负数)。在做 dijkstra 的时候,我们的边权取决于不固定的当前高度和固定的增长高度,然后类似 P1516 用 exgcd 把边权算出来松弛即可。 注意事项 请及时取模,否则在乘法和 exgcd 时
阅读全文
摘要:思路 若 aia_iai 的与结果中第 iii 位是 111,则必须每个 aia_iai 的第 iii 位都是 111。然后我们只需要从高位开始枚举 iii,如果次数足够那就操作,否则就不操作。 代码 # include <bits/stdc++.h> using namespace std;
阅读全文
摘要:思路 aaa 名志愿者,每名 111 份,共 aaa 份;bbb 支单挑队,每支 111 份,共 bbb 份;ccc 支双打队,每支 222 份,共 2c2c2c 份;ddd 支三人队,每支 333 份,共 3d3d3d 份。总共 a+b+2c+3da+b+2c+3da+b+2c+3d 份。 代码
阅读全文
摘要:思路 首先考虑朴素 dfs。若 A 必胜,则说明至少有一种情况能使得 B 必败;若 A 必败,则说明无论他取什么(或者不取),B 都必胜。 当然,那样会 TLE:例如当 A 取了 a,ba,ba,b 后 B 取了 c,dc,dc,d 与 A 取了 c,dc,dc,d 后 B 取 a,ba,ba,b
阅读全文
摘要:思路 我们可以先以 ccc 为第一关键字从小到大排序,aaa 为第二关键字从小到大排序,此时我们就只要删去 ai<aja_i<a_jai<aj 且 i<ji<ji<j 的元素即可,剩下的数下标从小到大排序输出就行。 代码 # include <bits/stdc++.h> using names
阅读全文
摘要:dfs 练手题。 思路 我们可以把每一辆车上的目前总重量记录下来,然后对于每一只猫枚举每一辆车,要么蹭上一辆车继续 dfs,要么自己新开一辆车 dfs。也可以再加一个最优性剪枝(即如果当前车数大于已知最优解就直接结束)。我这里还用了一个从大到小排序的优化,因为越小的越容易蹭车,不用开新车嘛。 代码
阅读全文
摘要:提速偷懒小技巧 使用 bitset 自带的位运算配上 01 背包,真是又快速又省代码长度! 思路 首先设 s=∑ais=\sum a_is=∑ai,若 s mod 2=1s\bmod2=1smod2=1,显然最开始就是好的,不用删;否则可以先用 01 背包判断是否存在子序列之和为 s2\frac
阅读全文
摘要:思路 字典树板子题。如果你不会字典树,请右转其它题解。 我们用 tri,jtr_{i,j}tri,j 表示从 iii 号节点转移过来且以字母 jjj 结尾的节点编号,si,js_{i,j}si,j 表示这种前缀字符串(从 iii 号节点转移过来且以字母 jjj 结尾)的个数,我们不管前缀有多长,
阅读全文
摘要:思路 首先我们设 sis_isi 是 aia_iai 的位数,则 f(ai,aj)=ai×10sj+ajf(a_i,a_j)=a_i\times10^{s_j}+a_jf(ai,aj)=ai×10sj+aj。首先先看放在地位的情况,aia_iai 会被放在低位 i−1i-1i−1 次
阅读全文
摘要:思路 题目中有一点对本题而言非常重要:mod=108,ai<108mod=10^8,a_i<10^8mod=108,ai<108,所以 ai<moda_i<modai<mod,这也就说明 ai+aj<2×moda_i+a_j<2\times modai+aj<2×mod。首先只有当 ai+a
阅读全文
摘要:思路 首先按照位置从小到大排序。 设 dpi,jdp_{i,j}dpi,j 表示对于前 iii 个弹珠,最后一个停止的弹珠。当 j<ij<ij<i 时,那么 iii 号弹珠要滚到 jjj 号弹珠的位置,耗费 xi−xjx_i-x_jxi−xj,dpi,j=dpi−1,j+xi−xjdp_{i,
阅读全文
摘要:思路 设 x=a×g,y=b×gx=a\times g,y=b\times gx=a×g,y=b×g,其中 ggg 为一个质数。根据 gcd\gcdgcd 的性质我们可以知道,gcd(x,y)=g×gcd(a,b)\gcd(x,y)=g\times\gcd(a,b)gcd(x,y)=g×gcd
阅读全文
摘要:思路 s0is0_is0i 表示第 iii 列中 . 的个数(此处不是 #,因为全改成 # 需要修改 . 的个数的代价),s1is1_is1i 表示第 iii 列中 # 的个数,dpi,j,kdp_{i,j,k}dpi,j,k 表示最后一列是第 iii 列且最后一列选了 kkk,已经连续相同了
阅读全文
摘要:思路 我们设 dpi,jdp_{i,j}dpi,j 表示翻转 ai∼aja_i\sim a_jai∼aj 后和增加了几。ai,ai+1,ai+2,…,aj−2,aj−1,aja_i,a_{i+1},a_{i+2},\dots,a_{j-2},a_{j-1},a_jai,ai+1,ai+2
阅读全文
摘要:思路 首先显然不能 O(∑m2)O(\sum m^2)O(∑m2) 暴力建边求最小生成树,要考虑更快的方法。让我们来回顾一下 kruskal 的实现过程: 先把所有边排序; 再按边权从小到大进行并查集,逐渐合并每个连通块,直到合并成一个块。 这个思路在这题中仍然可行。因为每个子集的所有边权是相同的,
阅读全文
摘要:思路 蒟蒻不会平衡树,只能使用单调队列力。 先用 mpimp_impi 表示数字 iii 在原数组中的位置,然后像滑动窗口一样,q1q_1q1 维护这 kkk 个数字内位置最靠前的数,q2q_2q2 维护位置最靠后的数,然后两个数减一减就是距离,取 min\minmin 即可。 代码 # i
阅读全文
摘要:思路 这是本人遇到的最简单 ABC-C。 nnn 个巨人叠罗汉,其实就是所有巨人的肩膀高度加最上面的头高度,即 ∑ai+bn−an\sum a_i+b_n-a_n∑ai+bn−an,要使高度最大,就选择头最长的巨人在最上面,即 ∑ai+max(bi−ai)\sum a_i+\max(b_i-
阅读全文
摘要:倒数第一分钟提交成功,同时带我在 CF 的第 555 场比赛中上青,留念。 思路 异或的性质: x⊕x=0x\oplus x=0x⊕x=0; a⊕b=b⊕aa\oplus b=b\oplus aa⊕b=b⊕a; 若 x⊕y=zx\oplus y=zx⊕y=z,则 y⊕z=x,x⊕z=yy\oplus
阅读全文
摘要:思路 赛时始终百思不得其解,赛后看了他人代码恍然大悟。 先看一下我画的 n=5n=5n=5 时的做法(x 表示选择的点): xx... ..... ..x.. ...x. ....x 首先距离为 000 是一定存在的,然后距离为 111 就在第一行,222 在 ai,i,ai+1,i+1(3≤i<n
阅读全文
摘要:思路 首先他们两人都一定是移动一段时间后永远停在某个位置上分,不可能是转了一圈回到起点(因为他不如留在那个最大分数的点),所以我们只要沿着 pip_ipi 跑一圈遍历,选择最终得分最大的那个店就好了,另一个人同理。另外注意可能出现跑不满一圈的情况,那跑到第 kkk 个点就退出循环。 代码 # in
阅读全文
摘要:思路 首先 a1a_1a1 只要比 x1x_1x1 大就行,例如 114514114514114514 就一定合法(因为 xi≤500x_i\le500xi≤500)。后面的 aia_iai 不仅要满足 ai>xia_i>x_iai>xi,还要满足 ai mod ai−1=xi−1a_i
阅读全文
摘要:思路 首先很显然,如果 a1∼aia_1\sim a_ia1∼ai 是 bbb 的子序列,那 a1∼ai−1a_1\sim a_{i-1}a1∼ai−1 肯定也是 bbb 的子序列,所以我们可以贪心枚举 iii,直到不满足条件的就退出循环。但也不需要对每个 iii 都单独做一遍判断,我们用变
阅读全文
摘要:思路 我们可以把问题转化一下:设每辆地铁都有一个固定车站 xxx,若想在 yyy 车站上车,就相当于是走过了一条 y→x,w=1y\to x,w=1y→x,w=1 的边,若想在 yyy 车站下车,就相当于走过一条 x→y,w=0x\to y,w=0x→y,w=0 的边。然后跑一遍最短路就好了,因为边
阅读全文