11 2022 档案
摘要:考虑设 f(i) 表示从低到高第 i 位的进位情况,0 表示不进位,1 表示进位。 分类讨论一下: f(i−1)=f(i)=1,那么 a,b 这一位有三种情况 (1,1),(1,0),(0,1)。 f(i−1)=f(i)=0,那么 a,b 这一位有三种情况 $(0
阅读全文
摘要:首先建出一棵 01-Trie,容易发现选择一个字符串之后,它的子树和到根节点的链上的节点都不能再选了。 仔细观察一下,发现剩下的树实际上是若干个满二叉树,那么要求出这些满二叉树的 SG 函数。 对于一棵深度为 x 的满二叉树(令根节点深度为 0),观察一下,发现: 若取根节点,则整棵树没了,
阅读全文
摘要:非常神的贪心,先要发现以下两个性质: 要花钱收买的一些人,那么肯定是在一开始就收买他们。 按照 m 升序排序,那么处理 m=x 时,m=1∼x−1 的人一定都投了票,不管是贿赂还是跟风。 性质一不难理解,而性质二基于性质一,在一开始收买完人后就像连锁反应一样,m 从小到大开始
阅读全文
摘要:T1: 容易发现每种药品之间互不影响,对每种药品分别计算,对于它所涉及到的区间开个 vector 存下来,离散化之后差分,然后前缀和,数出只有它一个线段覆盖的段即可。 时间复杂度 O(∑klog∑k+n+m)。 Code: #include <bits/std
阅读全文
摘要:T2: 先判 1,n 有连边的情况,也就是说明最短路一定是 1 直接走到 n。特判掉 k=1,n=2 的情况,这是无解的。那么如果 k≥2 就令 1,n 都为 U,其余随便分配,否则令 1,n 都为 P,其余随便分配。 否则不妨假设给 1 分配 U,给
阅读全文
摘要:稍微手玩一下可以发现: 若 y≥2x,那么 y−x>y 若 y<2x,那么 y−x=y y⊕x≥y−x 于是不难发现只有 y<2x 时才可能有贡献。 即 x,y 位数相同,最高位都为 1。 那么问题变成 $y\oplu
阅读全文
摘要:令 dis(i,j) 表示点 i,j 之间的曼哈顿距离。 如果钦定两个点 i,j 染同一种颜色,那么就可以发现这些东西: 不能存在点 k 与 i,j 不同色,并且满足 dis(i,k)<dis(i,j) 或 dis(j,k)<dis(i,j)。 对于所有点 $
阅读全文
摘要:将原题中的操作删除变成染色,即: 给出一棵树,每次随机等概率选择一未染黑的点,将它及其子树染黑。问期望多少次操作可以将树全部染黑。 首先由于期望的线性性,对每个节点分别考虑其期望被选中的次数。 假设当前在考虑点 u,那么只用考虑 1∼u 这条链上的点。 由于每个节点被选中的次数只有
阅读全文
摘要:首先由于期望的线性性,考虑对每个点分别计算它的期望操作次数。 然后设当前考虑的点为 u,那么只用关注根节点到 u 的链上的点。 对这条链上的操作满足以下两个性质: 只会对链上的坏点染色。 在这条链上所有点变成黑色,即 u 变成好点之前,一直都会对这条链进行操作。 然后就是整道题中最难以理
阅读全文
摘要:先发现以下两个性质: 对于所有段,它们的异或和就是所有数的异或和。 由于每段的异或和都一样,设为 d,并设 s 为所有数的异或和,总共分成了 x 段,则有 s=[xmod2=1]d。 设 \left{A\right} 的前缀异或和为 \left{pre\right}。 分
阅读全文
摘要:首先不难发现,字符串具体是啥对答案没有影响。 于是有两种做法,第一种我个人认为更好理解,就是由于长度相同的字符串,用相同操作次数产生它们的方案数是一样的,则设计 f(i,j) 表示用 i 次操作产生长度为 j 的字符串的方案数,则有 加入 0/1,$f(i+1,j+1)\gets f
阅读全文
摘要:设 f(S) 表示将字符串 S 拆分成 T 的前缀相连,最少需要划分成几段。 需要注意到一个性质,每个字符串被拆分时,最后一个子串应尽可能长。换句话说,若字符串 A,B 都是可以转移的位置,且 A 是 B 的前缀,则必有 f(A)<f(B),从 A 转移一定最优
阅读全文
摘要:先考虑暴力的 DP,设 fi 表示到根节点距离恰好为 i 的节点数量,则有 fi=n∑j=1fi−dj
初值为 f0=1,最终求的是 x∑i=0fi。 注意到 di≤100,有很多相同的转移,于是记 $cn
阅读全文
摘要:考虑二分最小值,设当前二分出的值为 x。 那么把区间中 ≥x 的变成 1,其余变为 0,那么就是查询区间内最长全 1 区间长度是否 ≥k。 这个类似于区间最大子段和,可以用线段树轻松维护。 而发现每个 x 都可能被用到,于是换成主席树即可。 时间复杂度 $\m
阅读全文
摘要:首先需要发现一个性质,每个串都是单调的,因为一个不单调的串一定可以拆分成若干个单调的串,并且不劣。 于是用 DP 处理出两个单调串相交的点分给哪个串即可。 具体的话就是设 fi 表示前 i 个位置的答案,如果 ai−2,ai−1,ai 是单调的,那么 $$f_i=f_{i
阅读全文
摘要:E: 简单最短路,加一维表示当前是否翻转所有边的状态即可。 Code F: 先考虑简化版本,如果 \left{A\right} 中没有 0,如何判定。 重新表述一下条件,令 mni,mxi 分别表示第 i 行中的最小值和最大值,则有 $mn_1\le mx_1\le mn_2\l
阅读全文
摘要:每一个 bool 变量表示「ai 是否 ≥j」,由于 ai 必然 ≥1,所以总的变量数是 n(k−1)。 然后我们根据题目条件来建有向边,注意 2-sat 要满足对称性,所以下文中每一个条件的逆否命题都要建边: ai≤ai+1,等价于「对于所有的
阅读全文
摘要:考虑时光倒流。 由于 A 操作只会给两个活跃的点连边,所以可以忽略,倒过来相当于没有删边操作。 然后只剩下加边,加活跃点,两种操作。每次暴力 DFS 即可。 时间复杂度 O(n+Q)。 Code: #include <bits/stdc++.h> using namespace
阅读全文
摘要:设当前枚举到第 i 位,x 为 i 前面期望连续 1 的个数。 令 ai=x,bi=x2,ci=x3。 a 很好转移, ai=(ai−1+1)×pi
b 的转移考虑 (x+1)2=x2+2x+1,则有 $$b_i=(b_{i
阅读全文
摘要:先对 k 进行二分,将最值问题转化成判定问题。 判定一个 k 是否合法时,贪心去考虑,一个节点下面的若干条链在合并时,一条链肯定和另一条使它合并后恰好满足长度限制的链合并最优。因此我们用 multiset 来进行维护,一条长度为 len 的链,去查询最小的长度 ≥k−len 的
阅读全文
摘要:和这题有点类似。 首先不难发现,如果当前 check 的值不是 n−1 的约数,一定无解。 然后进行一遍 DFS,每次用一个 multiset 保存子树传来的残链长度,然后贪心的配对。 最后如果 multiset 大小为空,给它的父亲返回 0。 否则如果大小为 1,给它的父亲返回这个值。
阅读全文
摘要:感觉和 COCI 2021-2022 #4 的 T4 一模一样。 显然考虑二分,设当前二分出的值是 lim。 那么就是称一个点能覆盖另一个点当且仅当它被选中且它与那个点的距离不大于 lim,要判断是否能选出不多于 m 个点覆盖到所有的关键节点。 贪心策略依旧一样,如果 i 作为被选择
阅读全文
摘要:先判掉 S,T 中某种字母出现次数不相等就输出 -1。 首先可以明确一个字母至多被操作一次。 考虑需要操作最少的字母等价于最多的字母不动。 发现不动的字母在 S 中形成了子序列,在 T 中形成了子串。 暴力枚举 T 中子串的起始位置,暴力匹配,求最大值即可。 时间复杂度 $\math
阅读全文
摘要:令 ci=ai−bi。 那么原题操作变成若区间 [l,r] 的 c 和为 0,那么可以将这段区间的 c 都变成 0。 最终目标是 c 全部变成 0。 令 sumi 表示 c 的前缀和。 此时操作变成,若 suml−1=sumr,可以将这段区
阅读全文
摘要:考虑对每个节点 u 计算贡献,它的贡献有以下三种: 以 u 为根,在整棵树里选 k 个点使得它们的 LCA 为点 u 以 u 的父亲所属的连通块里的某个点为根,在整棵树里选 k 个点使得它们的 LCA 为点 u 以 u 的某个子树
阅读全文
摘要:看到 Shift 先把 \left{a\right} 复制一遍。 构造一个新的序列等于 b+(−1)+a+a。 跑一遍魔改的 Z 函数就可以了,即判断当前的 ai⊕bj 是否等于 ai−1⊕bj−1。 最终统计答案的时候如果 zi=n 就
阅读全文
摘要:正难则反,考虑用所有路径减去不包含颜色 k 的路径。 删掉所有颜色为 k 的节点,发现树分成了好多个连通块,设它们的大小为 s1,s2,⋯,那么不包含颜色 k 的路径条数就是 ∑si×(si+1)2
暴力做是 $\mat
阅读全文
摘要:由于点的度数最大为 2,于是这张图由链,孤立点,大小至少为 2 的环组成,为了方便把孤立点也看成链。 考虑容斥掉第三个条件,最大连通块大小恰好为 L 的方案数即为最大连通块大小至多为 L 的方案数减去大小至多为 L−1 的方案数。 考虑 DP,设 f(i,j) 表示 i
阅读全文
摘要:看到次幂就得老老实实的把答案算出来。 不难发现对于一个排列的答案,它的贡献是 i→pi 后所有环大小的 lcm,于是设 f(i,j) 表示 i 个点组成的若干个环,环大小的 lcm 是 j 的方案数。 每次加入一个新的大小为 k 的环的
阅读全文
摘要:首先能发现一个矩阵是合法的,当且仅当它的每一行都和第一行一样,或正好相反。 充分性很显然,必要性的证明如下: 考虑一个矩阵如果合法,那必然能从一个全黑的矩阵进行若干次操作,因为操作是可逆的。然后如果操作行会使其与第一行相反,操作列不会影响其他行与第一行的相对状态。 令 s 表示原矩阵,$a_{i
阅读全文
摘要:F: 简单题,考虑增量模拟。 考虑选 i 带来的新的贡献。 如果 Aj≤Ai,那么贡献是 Ai。 否则贡献是 Aj。 用两个树状数组维护即可。 Code G: 构造 \left{b\right} 满足: b1=a1 $b_i=a_i-a_{i-1},i\gt
阅读全文
摘要:考虑容斥,拆成四部分,每部分都形如 n∑i=0m∑j=0f(i,j)
其中 f(i,j) 表示从 (0,0) 走到 (i,j) 的方案数,显然为 (i+ji)。 而 m∑j=0f(i,j)=f(i+1,m)
阅读全文
摘要:思路参考 AK_Dream 大佬 考虑容斥,计算钦定 k 位满足 ri=pi 或 ri=qi 的方案数。 建出 n 个点,将每对 pi,qi 连边,由于每个点度数都是 2,所以会形成若干个环和一些孤立点(自环)。 对于自环,则有 pi=qi,只用考虑 $r
阅读全文
摘要:构造 Xi=∑mj=1(−1)i+jAi,j,Yj=∑ni=1(−1)i+jAi,j。 则一个矩阵 B 能被矩阵 A 变成当且仅当 \left{X\right},\left{Y\right} 均相等。 必要性:很显然,因
阅读全文
摘要:DDP 板子。 设 fi,0/1 表示前 i 位,以 0/1 结尾的本质不同子序列有多少种。 则最终答案就是 fn,0+fn,1。 考虑转移,以当前字符为 0 为例,则有 $$f_{i,0}=f_{i-1,0}+f_{i-1,1}+1,f_{i,1}=f_{i-1,
阅读全文
摘要:设 f(i,j) 表示压缩后长度为 i,原串长度为 j 的方案数。 则最终答案就是 ∑n−1i=1f(i,n)。 考虑转移,枚举下一段的长度 k,设长度的位数为 x,则有 $f(i+1+x,j+k)\gets f(i+1+x,j+k)+25\times f(
阅读全文
摘要:令 disi 表示 i 到离它最近的充电站的距离。 这个很好办,建立一个超级源点,连向所有充电站,边权为 0,跑一遍最短路即可。 设走到点 u,剩余电量为 x,所需的最小容量是 c,则有 disu≤x≤c−disu
因为 u 点剩余的电量一定可以
阅读全文
摘要:考虑两种暴力。 直接枚举同颜色的点,枚举起点和终点,组合数计算路径数即可,复杂度 O(k2),其中 k 为该颜色的点的个数。 做一遍 O(n2) DP,遇到该颜色的点就统计答案。 根号分治,若 k≤n,采用暴力一,易知复杂度不超过 $\m
阅读全文
摘要:套路的二项式反演。 题目要求实际就是两种颜色的棋子所占的行和列都不能有交。 设 f(i,j,k) 表示在 i 行 j 列中放 k 个棋子使得每行,每列都不为空的方案数。则最终答案为: $$\sum_{i=1}^n\sum_{j=1}^m\sum_{k=1}^{n-i}\sum_{l=
阅读全文
摘要:假设当前在确定玩家 p 是否能成为唯一的赢家。 假设 p 能赢下所有不确定的比赛,令 win 表示他赢的数量。 如果 win=0 显然他不能成为唯一的赢家,下面都假设 win≥1。 考虑网络流建图。 建立源点 S,汇点 T,Ai,j 表示玩家 i 与 $
阅读全文
摘要:乘积是立方数说明分解质因数之后每个质数的指数都是 3 的倍数,于是可以对每个数的质因数进行哈希,指数对 3 取模,哈希之后求一遍前缀和,如果 Hr=Hl−1 就说明是立方数,否则不是。 Code: #include <bits/stdc++.h> using namespace
阅读全文
摘要:对于一个 p×m 的矩阵 A,与 m×q 的矩阵 B,定义广义矩阵乘法 A×B=C 的结果是一个 p×q 的矩阵 C,满足: $$C_{i,j}=(A_{i,1}\otimes B_{1,j})\oplus(A_{i,2}\
阅读全文
摘要:先来研究没有初始球情况下的简单版本: n 个小球,m 个盒子,每个小球等概率地放到盒子里,这样有 nm 种方案,每种方案的贡献是每个盒中球个数的乘积,计算所有方案贡献总和。 设 xi.j 表示第 i 个盒子中是否放入了第 j 个球,取值只有 0 或者 1。 对
阅读全文
摘要:首先有一个 O(N2) 做法。 考虑容斥掉条件一,令 g(i) 表示恰好有 i 个花园空着的方案数,f(i) 表示钦定有 i 个花园空着,剩下无限制的方案数。 则有 g(0)=N∑i=0(−1)if(i)。 而 $$f(i
阅读全文
摘要:考虑重新刻画一个序列的生成,设原数列为 (0,0),将所有数从小到大排序后依次加入。 例如 (2,3,1) 是这样生成的: (0,0)→(0,1,0)→(0,2,1,0)→(0,2,3,1,0)
于是问题变成多少种方案使得这样的序列存在 k+1 个位置 i 满足
阅读全文
摘要:首先可以想到枚举每条边上的白色石子个数,记为 k。 则最终答案为 d+1∑k=0f(k),f(x) 表示每条边的石子个数为 x 时的答案。 那么可以想到一个暴力的 dp 状态,设 fi,j,k 表示考虑了前 i 条边,最开始的点的颜色是
阅读全文
摘要:首先显然能想到二分,随后想想怎么判定。 ~~这里我卡住了(~~ 看了题解发现是一个常用的技巧。 先把所有 Y 的位置存下来,记为数组 A,记 Bi=Ai−i,那么发现交换就相当于把 B 中某个值加一或减一,接下来就是 check 能否在 K 次内形成一段连续的相同的值,由于
阅读全文
摘要:首先题目要求删去边权和最小的边使得图变成一张二分图,那么看到二分图就想到染色,那么题目的意思就是让同色节点之间的边权之和最小。不失一般性的,强制 0 节点为白色。 由于原图是一个环,这不好处理,考虑断开 N 和 1 之间的边,那么这样就能设计出一个 DP 状态,fi,j,k 表
阅读全文
摘要:前置:ABC214D 那题只要求 max,将边按照边权从小到大排序后依次加入,用并查集维护连通块大小并更新答案即可。 Code 于是这题也一样,把 max 和 min 分别求出来,然后减一减就好了。 但是有一个问题,这题是点权,如何转化成边权呢? 假设当前求 max。 那么将
阅读全文
摘要:套路题。 设 M=105。 设 f(i) 表示路径的 gcd 恰好为 i 时候的贡献,则答案为 ∑Mi=1i×f(i)。 套路的,将限制变成路径的 gcd 为 i 的倍数,设 g(i) 表示此时的贡献。 则有 $f(i)=g(i)-\
阅读全文
摘要:设 fi,j,0/1 表示考虑前 i 列,删去了 j 条边,目前上方和下方连不连通的方案数。 则有转移: fi,j,1=fi−1,j,1+3×fi−1,j−1,1+fi−1,j,0
$$f_{i,j,0}=2\times f_{i-1,j
阅读全文
摘要:首先先把颜色都离散化。 设 f 为所求答案,那么对于 f(1)∼f(n) 分别计算其期望。因为期望的线性性,分别考虑每种颜色被选中至少一个的概率(因为每种颜色对答案的贡献是 1 所以期望就等于概率)。 设有 m 种不同颜色,第 i 种颜色出现次数为 cnti,则有:
阅读全文
摘要:不难发现一定是拔高一段后缀。 所以设 fi,j 表示考虑前 i 个位置,拔高 j 次,第 i 个位置强制选的 LIS 的长度。 则有 $f_{i,j}=\max\limits_{1\le x\lt i,0\le y\le j,a_x+y\le a_i+j}\left{f_{x,
阅读全文
摘要:可以发现直接将每种颜色的第 i 个球分给第 i 个人就可以取到最优解。证明在下面。在这个方案中将每个人的第 i 个球标上 i,能取到最优解的方案中,标 1 的必须仍然是某人的第一个球,标 3 的必须仍是某人的第三个球。O(n) 正反扫两遍分别计算标 $2
阅读全文
摘要:设 fi,j,k 表示从 i 往前,第一个与 ai 颜色不同的位置是 j,第一个颜色与 ai,aj 都不相同的位置是 k 的方案数,其中某个值为 0 表示这个位置不存在。当然 i>j>k(特别地,当 j=0 时 k 可以为 0
阅读全文
摘要:寄,这都没看出来( 考虑把涂绿色看成同时涂上红色和蓝色,显然这是等效的。 这样红色和蓝色就独立了,枚举红色的个数即可。 时间复杂度 O(n)。 Code: #include <bits/stdc++.h> using namespace std; typedef long lo
阅读全文
摘要:设 fi,j 表示前 i 个位置使用 j 个 1 的方案数。 转移很简单:fi,j=fi−1,j+fi−1,j−1 但是有些状态是非法的,所以对于每个 i 求出其前缀可以操作的最右的位置 Ri,以及 prei 表示前缀 1 的数量。 于
阅读全文
摘要:E: 披着概率外皮的简单数数题。 Code F: 简单 DP,设 fi,j,0/1 表示前 i 个数,选的数的和为 j,第 i 个数选不选的最小操作次数。 转移很显然,不清楚可以看代码。 Code
阅读全文
摘要:E: 普通的状压 DP。 Code F: 不难发现撒网的右端点一定是某条鱼的位置,固定某条鱼不动,其它鱼的速度都变成与它的相对速度,算出其它鱼能在区间内的时间范围,做一个差分,然后取 max 就行了。 时间复杂度 O(n2logn)。 Code G: 原题 经典的二
阅读全文
摘要:E: 考虑维护当前所在位置的指针。 设当前点为 u。 对于第一个操作,我们可以将 u 新增一个儿子 x,并将指针转移到 x。 对于第二个操作,把指针转移到 fau 即可。 对于第三个操作,我们可以开一个 map,将点 u 放到编号为 x 的 map 中。 对于第四个操作
阅读全文
摘要:typedef long long ll; const int mod = 998244353; struct mint { int v = 0; mint(int _v = 0) : v(_v) {} mint &operator += (const mint &X) { return (v +=
阅读全文
摘要:考虑 x=2a,y=2b,a≠b 的情况,有 f(x+y)=f(x)+f(y)−f(0)。 因此可以归纳到任意情况,令 c=f(0),g(i)=f(2i)−c,那么有 f(s)=c+∑i∈sg(i)。 所以任意一组 $\left{c,g(0
阅读全文
摘要:性质,巨大多性质。 设 mn_x=\max\limits_{(x,y)\in E}\left{\min(b_x,b_y)\right},首先让 ai→mni(如果不够)。 关键性质:记 X 表示所有 bx>ax 的集合,$Y=\left{1,\cdots,n\ri
阅读全文
摘要:E: 考虑最后的答案一定在 [0,n] 中,所以对于每个 i 都保留它在这个范围内的值。 至多有 ∑ini=nlogn 个有效值,用 set 保存下来即可。 Code F: 咕咕咕,没学过 SA。 G: 随机选择两个数,钦定它们 modM 后
阅读全文
摘要:E: 按给出的顺序依次松弛每条边就好了。 Code F: 折半搜索典题,双倍经验。 Code G: 啥玩意啊不想做 Ex: 啥玩意啊不想做
阅读全文
摘要:模型转化题,转化不出来就白给。 可以把题目的条件翻译成以下组合语言: 有一排 n 个格子,你要在其中插入若干个隔板将其隔成若干段 有 m 个特殊格子 a1,a2,…,am,∀i∈[1,m] 你禁止在 ai 与 ai+1 之间放隔板 在
阅读全文
摘要:首先题目给出结论,对于任意 n,m 均有解。 所以如果 A 中后 x 个数和 B 中前 x 个数两两配对,就可以转化为 n−x,m+x 的子问题。 所以对于 A 中最后一个数 n−1,在 B 中至少存在一个数 x 使得 x\ &\ (n-1) = n-1。
阅读全文
摘要:高一老年人拉,还有最后一个月的 OI 生涯。 初赛乱打,反正是过了( 去杭州的路上在借 py 的手机打元,上一次打元还是中考回去时候,那次加特林技能一开狂暴 5s 秒杀 Boss(。 CSP 前一周的模拟赛因为坐在一个非常好的位置(适合摆),所以场场两位数,于是状态寄飞,感觉 CSP 要 4=了(
阅读全文
摘要:首先有 O(n2k) 的暴力 DP。 设 fi,j 表示前 i 个数分成 j 段的最小和,枚举转移点 k:f_{i,j}=\min\left{f_{k,j-1}+(s_i-s_k)\bmod p\right},其中 s 表示 a 的前缀和。
阅读全文
摘要:考虑一个最暴力的 DP,设 fi,j,k 表示走到 (i,j) 乘积为 k 的路径数,显然过不了。 考虑优化一下状态设计,设 fi,j,k 表示走到 (i,j) 还要至少乘上 k 才能不小于 n 的路径数,显然 k 形如 $\left\lceil \fra
阅读全文
摘要:设 fi,j 表示前 i 个位置,第 i 个位置的数字是 j 的方案数,si=∑jfi,j,mxi,j 为位置 i 往前全是 j 的最长长度。 $f_{i,j}=\left{\begin{matrix} s_{i-1}\ \ \ \ \
阅读全文
摘要:先规定一些东西: 若存在多个 p 使得 ∑pi=1ai 最大,默认最大(即最靠右)的一个 p 是它的最大前缀和的位置。 U 表示全集。 假设 p 是最大前缀和的位置,则说明不存在 1<x≤p 满足 $\sum_{i=x}^{p}a_i\lt
阅读全文