题目乱做笔记

CF1592F1

*2600,会也不会,看题解的。

发现了一个性质:操作二和操作三没甚卵用,然后依然不会。

考虑把矩阵修改变成单点修改,这样会好做 \(\rm inf\) 倍。

考虑把全白 \(\rightarrow\) 当前矩阵转化成当前矩阵 \(\rightarrow\) 全白。

然后,然后就想不下去了,开了题解。

题解的神仙思路:设 \(\rm B\) 的值为 \(1\)\(\rm W\) 的值为 \(0\),当然你换一换也是一样的。设 \(p_{i,j}\) 等于 \(a_{i,j} \ ⊕ a_{i,j+1} \ ⊕ a_{i+1,j} \ ⊕ a_{i+1,j+1}\),发现把 \(a\) 变成全 \(0\) 相当于把 \(p\) 变成全 \(0\)

然后就好做了,发现对于一个 \(p_{x,y}\),如果它的四个节点被翻转了偶数次,不会影响它的取值。

所以,一次操作 \(1\) 相当于翻转一个 \(p_{x,y}\),对于操作 \(2\),相当于翻转 \(p_{x-1,y-1},p_{x-1,m},p_{n,y-1},p_{n,m}\)

不难发现进行 \(\ge 2\) 次操作 \(2\) 必定是不优的,因为可以用六次操作 \(1\) 代替之。

然后就做完了,判一下是否进行了操作 \(4\) 即可。

CF1592F2

感觉有点阴间,先 skip。

CF1516E

*2500,考虑设 \(f_{i,j}\) 表示长度为 \(i\) 的序列,最少交换 \(j\) 次可以还原成 \(1...i\) 的排列。

转移显然,\(f_{i,j}=f_{i-1,j}+f_{i-1,j-1}*(i-1)\)

不难发现可以消耗步数,那么最多交换 \(j\) 次的答案就是 \(ans_j=\sum_{i=1}^j [i \mod 2=j \mod 2] \times f_{n,j}\)

时间复杂度 \(\mathcal O(nk)\),需要优化。

优化 \(1\):盲猜项数不会很多,直接拉插,没写过,应该是对的。

优化 \(2\):考虑二项式反演,设 \(g_{i,j}\) 表示 \(p_i \neq i\),且恰好需要 \(j\) 次还原的情况,不难得到:\(f_{i,j}=\sum_{k=0}^i \binom{i}{k} \times g_{k,j}\)
c
反演回来,得到 \(g_{i,j}=\sum_{k=0}^i (-1)^{i-k} \times \binom{i}{k} \times f_{k,j}\)

那么答案就是:\(ans_j=\sum_{i=1}^{\min(n,2*j)} \times \binom{n}{i} \times \sum_{k=1}^j [k \mod 2=i \mod 2] \times g_{i,k}\)

时间复杂度 \(\mathcal O(k^3)\)

CF1499E

*2400,傻逼题,直接 DP 即可。

CF1348E

*2400,一道很秒的题。

考虑答案上界:我不管莓的种类全都放进个篮子里,可以放 \(\frac{\sum a_i+b_i}{k}\) 个篮子。

考虑答案下界:我分别把每种莓放进篮子里,不管同一颗树可以不管种类的限制,可以放 \(\frac{\sum a_i}{k}+\frac{\sum b_i}{k}\) 个篮子。

不难发现上下界最多只差 \(1\),若相等,直接输出,若不相等,考虑这个 \(1\) 能不能加。

这个加的 \(1\) 显然是通过同一颗树加的,所以我们需要搞掉一些莓,设 \(f_{i,j}\) 表示前 \(i\) 棵树,搞掉了 \(\bmod k=j\) 的第一种莓是否可行,这里可以直接 \(\bmod k\) 的原因是 \(\frac{j}{k}\) 的部分显然可以自己放进篮子。

如果第一种草莓可以通过同一颗树移走 \(\ge \sum a_i \bmod k\) 个,且 \(\le k-\sum b_i \bmod k\) 个,这样才能凑齐一个篮子。

CF1109D

*2400,傻逼数数题,这种难度的题是怎么放到 \(\rm Div1\ D\) 的啊。

CF1307E

*2500,有点阴间的题。

显然的,每种颜色的奶牛最多只会出现两只,一只在左边,一只在右边。

显然的,每只奶牛若放在左边,必然有一个固定的睡觉位置。

我们考虑枚举这个固定的睡觉位置,设枚举的位置为 \(i\),我们要求的方案即为:左边的奶牛睡觉位置都 \(\le i\),且存在一只奶牛在 \(i\) 睡觉,右边的奶牛睡觉位置都 \(>i\) 的最优方案和方案数。

这个可以直接计数,只是分讨有点阴间。

CF1603C

随机开的一道 *2300,从晚上 \(9:00\) 想到晚上 \(9:30\),第二天数学课又想了一会,完全不会做,只会 \(\mathcal O(n^2)\),以为后面的步骤需要阴间数据结构。

结果查看题解,数论分块优化 \(\rm DP\)?我草完全想不到。

首先考虑如何计算一段区间 \([l,r]\) 的贡献。首先最后一个数肯定不变,然后向左推。

设当前位置为 \(x\),如果 \(a_x \le a_{x+1}\),那么不管它。如果不合法了,我们可以算出当前这个数需要分成几个部分,多分显然不优,然后我们需要让这些数尽可能平均,所以可以直接算出分成那些数,然后累加贡献即可。

然后考虑 \(\rm DP\)。设 \(f_{i,j}\) 表示第 \(i\) 个数减到了 \(j\) 的方案数(为啥是方案数,因为我们要累加每个点的贡献)。

考虑如何计算 \(i\) 的贡献,枚举 \(i+1\) 减到了哪个,不妨设为 \(x\),那么当前点需要拆成 \(k=\dfrac{a_i+x-1}{x}\) 个小点,贡献就是 \(k-1\),然后乘上 \(i\),因为我们对 \(1,...,i\) 都有这么多贡献,所以答案需要加上 \((k-1) \times i \times f_{i+1,x}\)

\(\rm DP\) 转移随便转移一下就行了,这是简单的。

发现每个 \(i\) 的合法状态只有 \(\sqrt n\) 种,数论分块优化 \(\rm DP\) 即可。

AGC010C

发现是判断是否合法,不妨找出一些必要条件。

首先,特判 \(n=2\) 的情况,然后找出一个度数 \(>1\) 的点为根,以这个根为起点 \(\rm DFS\) 一遍。

对于以 \(x\) 为根的子树,我们发现路径有两种形式:从 \(x\) 往上连的/在 \(x\) 的两个不同子树内两两匹配的。

我们设往上连了 \(f_x\) 条路径,两两匹配了 \(g_x\) 条路径。

容易发现 \(f_x+2 \times g_x=sum_x\)\(f_x+g_x=a_x\)。其中 \(sum_x\) 表示 \(x\) 的儿子们一共往上连了 \(sum_x\) 条边,即 \(sum_x=\sum f_v\)

这是一个一元二次方程,我们可以把它解出来,判一下 \(f_x,g_x\) 是否是非负整数,不是非负整数显然无解。

如果 \(f_x>a_x\),那么无解。

在以 \(x\) 为根的子树内我们最多匹配 \(\max(\dfrac{sum_x}{2},sum_x-\max f_v)\) 组,如果 \(g_x\) 大于了这个数字,那么也无解。

而且根节点 \(f\) 值必须为 \(0\),不然无解。

容易发现另外情况均有解。

P6217

简单题,把 \(\rm lcm(a_i,x)\) 变成 \(\dfrac{a_i \times x}{\gcd(a_i,x)}\)

分子的维护是简单的。\(\gcd(a_i,x)\) 可以变成两个前缀的形式,我们除一下即可。

考虑离线询问,依次加点,加到第 \(i\) 个点的时候处理 \(1 \sim i\) 的询问。

分离每个只因子的贡献。

发现 \(\sqrt {200000}\) 内的质数只有 \(80\) 多个,而 \(> \sqrt {200000}\) 的质数的次数显然只能是 \(1\),两个树状数组统计一下即可。

AGC014D

发现先手胜利的充分必要条件是存在一个白点没有黑点与之相邻。

考虑一个三个点的树:\((1,2),(1,3)\)。我们发现先手必胜,因为我可以标记 \(1\) 为白点,然后不管后手标记哪个为黑,我标记另一个为白就获胜了。

考虑一条链的情况,我如果将这条链链底的父亲染白,后手只能把链底染黑。如此这般,先手必胜。

盲猜正解就是模拟这个过程。我们遍历每个点,每次把叶子节点和它的父亲删掉。如果遍历完后这个点后这个点还没被删,那么这个点就以及被删成了叶子,判一下父亲是否被删,被删了就先手必胜,没被删就把它们两个都删掉,回溯回去。

结果过了。

AGC015D

\(a=b\) 时,输出 \(1\)

否则 \(a \neq b\),把 \(a\)\(b\) 二进制分解,从高往低找到第一个 \(a\)\(b\) 不同的位置 \(x\),不难发现 \(x\) 之前的位都没用。

然后不会了,看题解。

官方题解做法:

易证原问题等价于任选两个数能组成的或值个数。

可以这么构造证明:如果一个数 \(x\) 能被表示出来,那么我们找到 \(x\) 的最高位。

如果 \(a \le x \le b\),那么命题显然成立。

接下来只需要考虑 \(x>b\) 的情况。

\(x\) 的最高位是第 \(y\) 位。

首先这些数的最大值一定大于等于 \(x\) 的最高位的值。

分两种情况。

如果这些数的第 \(y\) 位都是 \(1\),我把这两个数的第 \(y\) 位也赋值成 \(1\),不管这一位,继续往后寻找第一个是 \(1\) 的位,然后把这个位设成新的 \(y\),再来一次。

如果存在一个数的第 \(y\) 位是 \(0\),则这个数一定小于等于 \(x\) 异或第 \(y\) 位的值,我把一个数设成第 \(y\) 位的值,一个数设成 \(x\) 异或第 \(y\) 位的值,不难发现这两个数一定夹在这些数的最小值和最大值之间,所以显然合法,然后就找到了一组合法方案,直接 \(\rm break\)

不难发现我们构造不出来这两个数当且仅当这些数都相同,而若这些数都相同,不可能构造出 \(x\) 使得 \(x>b\),所以一定能构造出方案,原命题成立。

首先把上面一坨相同的位去掉,此时一定有 \(b\) 的最高位是 \(1\)\(a\) 的最高位是 \(0\)

\(z\)\(b\) 的二进制最高位对应的值。

则我们把区间 \([a,b]\) 分成两个区间:\([a,z)\)\([z,b]\)

我们此时的或可以分成三种:\([a,z)\) 之间内部运算,\([z,b]\) 之间内部运算,两部分区间交叉运算。

我们先看第一种,显然的,此时可以表示出 \([a,z)\) 的所有元素。

然后看第二种,我们找出 \(b\) 最高位后面的第一个 \(1\) 的位置,记为 \(x\),设 \(p\) 表示把 \(b\)\(x\) 位及之后都赋值成 \(1\) 后的值,则我们可以表示出 \([z,p]\)

接下来是第三种,不难发现只需要与 \(z\) 或运算即可表示出所有可能表示出的数,所以一定是一段连续的区间 \([a|z,(z-1)|z]\)

三个区间取并即可。

AGC015C

傻逼题,点数-边数即可。

ARC116E

首先二分答案。

然后考虑 \(\rm check\),对每个点记 \(w1_x,w2_x\) 表示这个点子树内最远未覆盖的节点和最近被覆盖的节点。

如果 \(w1_x+w2_x \le mid\),那么 \(x\) 被覆盖。

如果 \(w1_x+w2_x > mid\)\(w1_x=k\),则说明必须要在 \(x\) 上设一个节点。

特判根节点即可。

AGC024D

考虑枚举每个点/边作为根,那么最终一定是形如一颗满二叉树剪掉一些子树。

颜色数可以直接求出。

考虑叶子节点数怎么求:取所有层点度数的 \(\max\) 然后乘起来即可。

P4208

\(\rm Matrix\ Tree\) 板子,注意到最小生成树有以下性质:

\(1.\) 最小生成树每条边需要加进去的个数是固定的。

\(2.\) 最小生成树每种权值的边不管如何加入,联通性都是相同的。

所以我们可以先求出最小生成树,然后枚举每种权值的边,把除它之外权值的边均加入,求行列式即可。

算一下复杂度:等于给你一个序列 \(c\),满足 \(\sum c_i=n\),求 \(\sum c_i^3\) 的最大值,发现不会超过 \(n^3\)

P3644

首先如果居民的办公室和家都在河的一旁,可以直接忽略。

\(K=1\) 的情况是简单的,问题就相当于:给你偶数个点,求 \(K\) 个特殊点使每个点到这 \(K\) 个点的距离的最小值总和最小,取中位数即可。

\(K=2\) 时,设我们选了两座桥 \(p,q\),那么答案为:\(\sum \min (|a_i-p|+|b_i-p|,|a_i-q|+|b_i-q|)\)

这个 \(\min\) 的限制相当烦,要是我们能把这些点分成两部分,一部分都走 \(p\),一部分都走 \(q\),问题就好做了。

\(f(x)=|a_i-x|+|b_i-x|\),画出函数图像,是一个天线函数,由斜率为 \(-2,0,2\) 的三条直线组成。

我们取中点 \(m=\dfrac{a_i+b_i}{2}\),则在区间 \((-∞,m]\) 这个函数是单调不上升的,在区间 \([m,∞)\),这个函数是单调不下降的。

由此我们得出结论:若 \(|p-m| \le |q-m|\),则选 \(p\) 一定不劣于选 \(q\),反之选 \(q\) 一定不劣于选 \(p\)

而进一步转化这个结论,得出:若 \(m \le \dfrac{p+q}{2}\),则选 \(p\) 一定不劣于选 \(q\),反之选 \(q\) 一定不劣于选 \(p\)

所以我们按照 \(a_i+b_i\) 从小到大排序,选 \(p\) 的一定是一段前缀,选 \(q\) 的一定是一段后缀。

枚举前缀后缀的分界点,两边都用 \(K=1\) 的方法做就行了,用对顶堆或 \(\rm Fido\_Puppy\_Treap\) 动态维护中位数即可。

AGC050C

首先盲猜合法条件是存在一个前缀使得 \(\rm B\) 的个数比 \(\rm S\) 的个数多 \(2\)

然后考虑设 \(f_i\) 表示恰好在前缀 \(i\) 合法的方案数。

需要容斥,直接来是 \(\mathcal O(n^2)\) 的。

但是这个合法条件是假的。

事实上,设 \(L\) 表示 \(\rm snuke\) 往左能走的房间数,\(R\) 表示 \(\rm snuke\) 往右能走的房间数,则一次操作可以另 \(\rm snuke\) 的行走范围变成 \((\min(L,R),0)\)

\(\rm snuke\) 一次行走只能把 \((L,R)\) 变成 \((L+1,R-1)\)\((L-1,R+1)\)

ABC240G

首先把“恰好”改成至多,然后让 \(n\)\(n-1\) 的答案做个差分即可。

好像不太行,考虑直接计数。

把三维分开来考虑。

我们首先枚举第一维走了几步,这个方案数可以直接组合数求出。

然后接下来我们要 \(\mathcal O(1)\) 算出两维的情况下走恰好 \(i\) 步的方案数。

把它转化成切比雪夫距离,发现等价于 \((x+1,y-1),(x+1,y+1),(x-1,y-1),(x-1,y+1)\),然后两维是独立的,分别计算然后乘起来即可。

ARC027D

蚌不住了,直接暴力能过。

立方体とペンキ

洛谷上只有一个人通过的题,\(\rm AT\) 上只过了两页人,而且没有题解。

不过好在想出来了。

考虑怎么样的块会使表面积 \(-4\),不难发现是一些柱子的顶部,且周围没有东西跟它碰到。

所以我们可以直接把这些块先除掉。

然后接下来我们会把原数组分成若干区间,这些区间是极大的相等子串。

\([l,r]\) 为其中一个区间,则若 \(a_l>a_{l-1}\)\(a_r>a_{r+1}\),则把整个区间消掉 \(1\) 会额外减掉边界两块面积的贡献,若不满足这个,则不会额外减掉贡献。

我们可以用优先队列维护这些区间,然后每次取长度最小的,把区间 \([l,r]\) 消成 \(\max(a_{l-1},a_{r+1})\),然后会合并一些区间,不难发现合并只会发生 \(\mathcal O(n)\) 次,所以时间复杂度 \(\mathcal O(n \log n)\)

合并区间的时候需要一些分讨。

Equilateral

发现任意一个合法点对都存在两个点在 \(45\) 度斜线上。

于是我们可以枚举这两个点,大约只有 \(\mathcal O(n^3)\) 种点对。

然后考虑第三个点有几种可能,发现是一条 \(45\) 度斜线的某段区间的和,转切比雪夫距离后前缀和即可。

ARC047B

先曼哈顿距离转切比雪夫距离,然后我们发现以 \(p\) 为中心的正方形的边长一定是 \(\max(max_x-min_x,max_y-min_y)\)

然后对有几个边界上有点分类讨论,发现 \(p\) 的横坐标一定是 \(min_x+\dfrac{d}{2},max_x-\dfrac{d}{2}\) 中的一个,纵坐标同理。

于是枚举这 \(4\) 个点,\(\mathcal O(n)\) \(\rm check\) 即可。

AGC052B

我们把边权转为点权,这样一次操作就是交换相连两个点的点权。

注意到此时我们的点权可以任意排列。

\(f_x\) 表示最终 \(x\) 的点权。

注意到任意一组合法方案都可以规约到 \(f_1=0\) 的情况(所有数都异或上 \(f_1\),边权异或和不变)。

现在我们求出了 \(f\)

我们设 \(d_x\) 表示初始 \(x\) 的点权。

同样钦定 \(d_1=0\),那么最终答案合法的充要条件是 \(d_i ⊕ g\) 后与 \(f\) 相同。

注意到当 \(d_i ⊕ g\)\(f\) 相同时,它们的异或和也相等。

也就是 \((d_1 ⊕ g) ⊕ (d_2 ⊕ g) ⊕ ... ⊕ (d_n ⊕ g)=f_1 ⊕ f_2 ⊕ ... ⊕ f_n\),由于 \(n\) 是奇数,所以可以解出 \(g\)

然后代回去判断是否合法即可。

ABC193F

看到这个题就感觉非常 \(\rm flow\),事实上确实也是 \(\rm flow\)

刚开始想到可以把每个点拆成黑点和白点两个状态,不过这样等于限制两条边只能流一条,是假的。

最大流不行,考虑最小割。

注意到经典模型:使两边颜色相同的边数最大

而如何套用到这题呢?把 \((i+j) \bmod 2=1\) 的格子反色即可。

ABC201F

首先可以让 \(B_i\)\(C_i\) 都与 \(A_i\)\(\min\)

然后我们可以把三种操作分成三个部分:先左移,后右移,最后任意移。

容易证明需要左移的点在值域上一定是一段前缀,右移的一定是一段后缀。

而中间留下一段值域连续的任意移动部分,等于求一个最长带权上升子序列(这些点不用移动,其余点需要任意移动)。

直接来是 \(\mathcal O(n^2 \log n)\) 的。

我们考虑把前缀压到一个 \(\rm DP\) 状态里去,这样就可以直接转移,用树状数组优化转移即可。

CF1758E

首先考虑如何 \(\rm check\) 一组方案是否合法。

我们可以规定操作顺序,显然对最终结果没有影响,所以不妨认为先操作行,再操作列。

那么合法条件就变成了能否操作一些行,使得每列的数都相等。

这个合法条件又等价于矩阵每行的差分数组(\(\bmod h\))意义下相等。

显然,每列的差分数组也必须相等。

既然已经转化到这里,不妨把每列分开考虑,先不考虑第一列。

如果这一列存在一个固定的数,那么这一列也随之确定(列差分数组是确定的)。

如果这一列不存在固定的数,那么就对答案有 \(\times h\) 的贡献。

第一列的放置情况要根据行的情况确定。

根据行的差分数组推得每个位置可以任意放还是固定。

然后简单计数一下即可,注意判断无解。

差分数组可以简单用带权并查集维护。

CF1844E

其实与 CF1758E 非常类似。

观察 Great Grids 的性质,以 $$ 表示 \(a_{i,j}=a_{i+1,j+1}\)\(/\) 表示 \(a_{i,j}=a{i+1,j-1}\)

那么两行的 \(\/\) 数组要么完全相同,要么完全相反。

这等价于每一行的元素相等情况完全相同。

每行分开来,然后并查集判断即可。

CF1824C

考虑最终方案是如何的。

不难发现会存在若干叶子节点在叶子节点上单点修改以满足条件。

另外一些点通过非叶子节点修改满足条件。

\(g_{x,i}\) 表示 \(x\) 子树内的点都修改为 \(i\) 的最小代价。

显然 \(\max g_{x,i}-\min g_{x,i} \le 1\),所以设 \(f_x=\min g_{x,i}\)

那么首先 \(f_x=\sum f_v+1\)

接下来我们可以选择一些子树是的它们的修改不变。

额外维护一个 \(\rm set\) 表示 \(f_x\) 取到最优值 \(x\) 子树内可以修改成哪些值。

这样就可以方便求出了。

CF1290C

发现题目中的条件等价于每个点只会被包含在至多两个集合里。

那么一个 \(s_i\) 若为 \(0\),则等价于这两个集合一个选了,另一个就必须选,一个不选,另一个也不能选。

一个 \(s_i\) 若为 \(1\),则相反。

考虑使用扩展域并查集维护这个东西。

我们设“选”为第一层,“不选”为第二层。

那么一个连通块要么全选第一层的点,要么全选第二层的点。

所以维护两个 \(siz\)\(\min\) 就行了。

注意到每种连通块会被算两次,所以要 \(/2\)

特判 \(s_i\) 只被一个集合包含的情况。

CF1495D

先转化一下题目的条件。

我们对于每个 \(i\)\(\rm bfs\) 一遍求出 \(dep_{i,j}\) 表示以 \(i\) 为起点 \(j\) 的深度。

那么题目的条件就是每条边 \((u,v)\) 满足 \(|dep_v-dep_u|=1\)

我们给每条边定向,限制就变成 \(dep_v-dep_u=1\)

考虑一棵树怎么算答案。

枚举 \(i\),然后枚举深度,上一个深度向当前深度连边,可以对于每个点简单统计一下上一个深度有几个点能到它,乘法原理即可。

那么对于两棵树呢?

观察一下,发现 \(i,j\) 的答案相对于 \(i\) 的答案等价于多满足:

  • \(i \sim j\) 的路径上满足 \(dep_{j,fa_{x}}-dep_{j,x}=1\)

  • 对于不在 \(i \sim j\) 路径上的边 \((u,v)\) 满足 \(dep_{j,v}-dep_{j,u}=1\)

考虑分层之后 \(\rm dp\),设 \(f_{x,y}\) 表示目前 \(\rm dp\) 到第 \(x\) 层,第 \(y\) 个点后面要接 \(j\) 的方案数。

直接转移即可做到 \(\mathcal O(n^4)\)

这时候需要一个很厉害的观察:如果 \(i \rightarrow j\) 的最短路不止一条,那么答案一定是 \(0\)

有了这个性质之后我们就不需要 \(\rm DP\) 了,套用一棵树的方法简单计数就行了。

太妙了,时间复杂度 \(\mathcal O(n^2m)\)

CF283E

考虑统计不合法三元组的数量。

不难发现不合法三元组等价于三元组内存在一个点的出度是 \(2\)

那么我们可以求出最终状态下每个点的出度,不妨设为 \(d_i\),答案就是 \(\sum \binom{d_i}{2}\)

至于 \(d_i\) 也很好维护,每个 \((l,r)\) 等价于给二维矩形异或 \(1\),离线扫描线即可。

P2416

题意就是给出一张无向图,有若干关键边,一条边走过后不能再走,\(Q\) 次询问是否存在一条 \(u \rightarrow v\) 的路径上有关键边。

缩边双,不难发现一个边双内的边都能走过。

然后就做完了。

CF1677D

考虑没有 \(-1\) 的情况。

发现每个序列对应一个原序列。

至于交换 \(k\) 轮?

把原序列求出来之后可以求出最多能交换几轮。

然后打个表,发现长这样:

1 16 54 96 120
1 8 18 24
1 4 6
1 2

设最多能交换 \(x\) 轮,则答案为 \(k! \times k^{x-k}\)

「LibreOJ NOI Round #1」北校门外的回忆

考虑 \(k\) 是奇数。

\((i,i+\text{lowbit}(i))\) 连边,发现连出来若干条链,并且不交。

\(k\) 是偶数则每条链会有一些很短的分叉。

所以每个点暴力跳 \(\log\) 次后总是会跳到一条很长的链上。

每条链可以开一颗线段树维护,接下来我们只需要定位出某个点在哪条链上以及是第几个就行了。

发现 \(\rm lowbit\) 值是有迹可循的,一定是形如 \(p_1,p_2,p_3,p_4,...,p_k,p_1,p_2,p_3,...,p_k,p_1,...\) 的。

于是我们可以倍增,然后就做完了。

Birthday

首先需要发现答案是 \(2^k\) 的形式,考虑反证,若答案存在一个 \(>1\) 的奇数因子 \(B\),那么在 \((x,y) \rightarrow (x+y,x-y)\) 的过程中若想要 \(x+y\)\(x-y\) 都含有 \(B\),必然有 \(B|x,B|y\),也就是 \(\forall i,B|i\),显然不成立。

\(N\) 为第一个 \(\ge n\)\(2\) 的次幂,那么答案至少是 \(N\),考虑构造达到这个下界。

我们先将所有数转化成 \(2\) 的次幂的形式,然后再转化成相等。定义函数 \(\verb!work(n,k)!\) 表示我想将 \(2 \times 2^k,3 \times 2^k \dots n \times 2^k\) 都转化成 \(2\) 的次幂,那么分类讨论:

  • \(n\)\(2\) 的次幂,递归到 \(\verb!work(n-1,k)!\)
  • \(n\) 不是 \(2\) 的次幂,找到 \(\le n\) 的最大 \(2\) 的次幂 \(m\),将 \((m+i) \times 2^k\)\((m-i) \times 2^k\) 配对,那么会得到 \(m \times 2^{k+1}\)\(i \times 2^{k+1}\),前者已经合法,仅需递归到 \(\verb!work(n-m,k+1)!\) 解决后者即可,对于剩下的部分 \(2 \times 2^k \dots (2m-n-1) \times 2^k\) 递归下去即可。

这个方法的操作次数不太好证明,但至少是 \(\Theta(n \log n)\) 级别的。

现在所有数都是 \(2\) 的次幂,考虑转变成相等,继续分类讨论:

  • 如果存在两个数相等,并且它们都 \(<N\),那么直接合并即可。
  • 如果存在 \(0\),那么让某个数与 \(0\) 合并,转化成存在两个数相等的情况。
  • 如果不存在 \(0\),取出两个数 \(2^a\)\(2^b\),不难发现可以用两次操作使它们变成 \(2^{a+1}\)\(2^{b+1}\)

后面部分同样是 \(\Theta(n \log n)\) 级别的,但是实际使用的次数非常少。

posted @ 2023-02-24 16:00  Tx_Lcy  阅读(76)  评论(0)    收藏  举报