do_while_true

一言(ヒトコト)

2023.11 ~ 我明白太放不开你的爱 太熟悉你的关怀 分不开

1. LOJ 6502 「雅礼集训 2018 Day4」Divide

从大到小排序,那么能与 \(w_i\),产生贡献的一定是一个前缀。但是还不够,因为这个前缀可能 \(<i\),所以还是要对每个前缀记录 \(|A|\)。如果让这个产生贡献的前缀要不然是 \(i\) 要不然是 \(0\) 就可以只记当前的 \(|A|\) 了。也就是对于每个 \(w_i\),在其前面的 \(w_j\) 要不然全部 \(w_i+w_j\geq m\) 要不然全部 \(w_i+w_j<m\)。归纳构造,当 \(w\) 从小到大排序之后 \(w_1+w_n\geq m\),那么 \(w_n\) 可以直接放到最后,要不然 \(w_1\) 放到最后。这样重排之后就可以 \(\mathcal{O}(n^2)\) dp 了。

2. P5419 [CTSC2016] 单调上升序列

给出了最长的单调上升路径的下界是 \(\frac{2m}{n}=(n-1)\)。尝试将其构造出来。关键是发现如果两个相邻的权值,不是相邻边,那么这两个权值一定不会出现在同一个单调上升路径上。更近一步地,如果权值在 \([l,r]\) 里的边均两两不相邻,那么一条单调上升路径至多出现一个权值在 \([l,r]\) 内的边。现在想要尽可能搞出多的两两不相邻边,也就是完美匹配。将所以 \(\frac{n(n-1)}{2}\) 条边划分为 \((n-1)\) 组完美匹配即可。构造见这里,利用 \(n-1\) 边形去构造,连出边来旋转 \((n-1)\) 次得到所有的合法图形。

3. IMO 1997 p4

solution

增加一问 \((c)\):对所有存在解的 \(n\) 给出 \(n\times n\) 的合法矩阵的构造。

\((a)\):考虑一个数 \(x\) 出现在主对角上会满足 \(1\) 个十字,未出现在主对角线上会满足 \(2\) 个十字,它需要满足 \(n\) 个十字,由于 \(n\) 为奇数那么它至少要在主对角线上出现一次,所以 \(2n-1\leq n\Rightarrow n\leq 1\)

\((b)\):若存在 \(n\times n\) 且主对角线均为 \(1\) 的合法矩阵 \(A_n\),可构造出合法的 \(A_{2n}\)\(A_{2n}=\begin{bmatrix} A_n & B_n\\ C_n & A_n \end{bmatrix}\),其中 \(B_n\)\(A_n\) 中每个数加 \(2n\) 得到,\(C_n\)\(B_n\) 的主对角线由 \(2n+1\) 改为 \(2n\) 后的结果。\(A_1\) 显然有解,从而所有 \(A_{2^k}\) 均有解。

\((c)\)\(2n\) 个点的无向完全图必定存在 \((n-1)\) 组不交的最大匹配,对于第 \(i\) 组最大匹配中的边 \((x,y),x<y\),令 \(A_{x,y}=i,A_{y,x}=i+n\),最后令主对角线 \(A_{i,i}=n\) 即得到合法构造。

4. P6276 P6276 [USACO20OPEN] Exercise P

对于所有质数次幂 \(t=p^k\),计算 \(t\mid \operatorname{lcm}\) 的方案数,再将 \(p^{cnt}\) 乘起来得到答案。反过来计算 \(t\nmid \operatorname{lcm}\) 的方案数。现在一个置换环的 egf 是 \(\sum_{i\geq 0} \frac{x^i}{i}-\sum_{i\geq 0} [i\bmod t=0]\frac{x^i}{i}=-\ln(1-x)+\ln(1-x^t)/t\),再 \(\exp\) 得到置换的方案数是 \(\frac{(1-x)^{1/t}}{1-x}\),那么 \(t\nmid \operatorname{lcm}\) 的方案数就是 \(n![x^n]\frac{(1-x^t)^{1/t}}{1-x}\)

\(\frac{1}{1-x}\) 相当于作前缀和,而分子只有 \(t\) 的倍数处有值。所以 \(n\) 可以直接减去模 \(t\) 多的那部分来化简,令 \(k=\lfloor\frac{n}{t}\rfloor\),则有 \([x^{kt}]\frac{(1-x^t)^{1/t}}{1-x}=[x^{kt}]\frac{(1-x^t)^{1/t}}{1-x^t}=[x^{kt}](1-x^t)^{1/t-1}=(-1)^k\binom{1/t-1}{k}\)

现在要计算 \(n!(-1)^k\binom{1/t-1}{k}\),注意它是放指数上的要对 \((\bmod -1)\) 取模所以需要手动展开一下,注意 \(p^k\) 的倒数和是 \(\mathcal{O}(n\log\log n)\) 级别的,所以这里我们接受 \(\mathcal{O}(k)\) 相关的复杂度。化简得 \(\frac{n!(t-1)(2t-1)\cdots(kt-1)}{k!t^k}\),考虑计算 \(\frac{n!}{k!t^k}\)\(k!t^k\) 实际上就是 \(t(2t)(3t)(4t)\cdots (kt)\),于是这个式子相当于 \(1,2,\cdots ,n\)\((k+1)\) 个区间乘积。为了保证 \(\mathcal{O}(n\log\log n)\) 的复杂度,实现 Sqrt Tree 即可。(代码偷懒了写的猫树 呜呜呜 Sqrt Tree 看上去好难写啊)

Code

5. UOJ76 懒癌

对于一个得病人的开枪时间是,假装自己没有病,所有情况中,最迟的开枪时间再 +1。它看到的该咋病就咋病,它没看到的就需要枚举。在所有情况中取 dp 值最大的再 +1 即为自己的 dp 值。转移出现环那么环上的所有状态 dp 值均为 inf(永远不会开枪)

如果 \(x\)\(y\) 那么 \(x\to y\),在这张图上考虑,得病的染成黑色,每次相当于将一个黑点染黑,再将后继中的若干点变色。答案就是最终所有点都是白色时,最大的《曾经是黑色》的点数。此时发现如果一个 \(>1\) 个点的 SCC 被染黑其中一个那么永远不会开枪,否则就是后继节点个数。所以只有不能被 \(>1\) 个点的 SCC 到达的点才能是黑色。

这时就能看出来对于某种染色方案,答案是所有能被黑点到达的点的个数。先将合法点求出来,再对每个合法点求出它能被多少合法点到达,答案的统计就很简单了。

时间复杂度 \(\mathcal{O}(n^3/w)\) 传递闭包。

Code

6. XX Open Cup gp of Zhejiang F

这么妙?trick:假设点的编号是 \(0\sim n-1\),将 \((2i,2i+1)\) 再连一条边,《原图的匹配》和《新图中若干环,链和单点》,是一个双射。将 \((2i,2i+1)\) 绑定之后,对每个集合 \(S\) dp 出 \(w[S]\) 表示 \(S\) 中连成一条链/环的权值和。链可以 dp \(f_{S,i}\) 表示 \(S\) 集合内以 \(i\) 号点为终点的链的权值和。环的话钦定 \(S\) 中最小的点作为起点,那么就是需要 dp \(g_{S,i}\),其定义与 \(f\) 不同的就是起点一定是 \(S\) 中最小的点。求出 \(w\) 之后可以集合幂级数 exp 这样总复杂度就是 \(\mathcal{O}(2^{n/2}n^2)\),当然后面直接 \(\mathcal{O}(3^n)\) 也是能行的。

Code

CCPC 2023 桂林

E Prefix Mahjong

考虑怎么 check,那就是按值域 \(f_{0/1/2,0/1/2,0/1}\) 表示前前位置开头有几个顺子,前一个位置开头有几个顺子,是否已经有雀头。转移是一个矩阵乘法,那么直接在值域上线段树维护矩阵乘法。因为是 01 矩阵所以可以压位,然后值域可以离散化到 1e5,这样复杂度就是 \(\mathcal{O}(n k^2\log n)\),其中 \(k=18\)

Code

I Barkley II

计算 cnt-mex 最大的区间。枚举 mex 是 \(x\),计算删去 mex 之后剩余的若干区间 cnt 最大是多少。这里虽然不能保证 mex 是 \(x\),首先答案一定能被统计到,其次算错的话真实 mex \(<x\),只会更劣,所以这么做是对的。

Code

H Sweet Sugar

一个连通块合法当且仅当 \(\sum\geq k\) 且与 \(k\) 同奇偶。和这个题一样证,\(w\) 合法那么 \(w-2\) 一定合法。所以贪心一下就行了。

Code

C Master of Both IV

枚举 xor \(=x\),考虑它的真因子一定 \(\geq x/2\),无论怎么异或都搞不出 \(x\) 的最高位,所以一定有奇数个 \(x\),从而 \(x\) 的真因子 xor 和为 0。xor 为 0 的个数即为不在线性基里的元素个数,注意去重以及统计 \(x=0\) 的情况。

Code

B The Game

从小到大排序之后,应当是 \(A\) 的后 \(m\) 个对应到 \(B\) 的后 \(m\) 个,记录 \(A\) 的后 \(m\) 个的总大小 \(sa\)\(B\) 的后 \(m\) 个的总大小 \(sb\),以及 \(A\)\(B\) 多出来的数的个数 \(res\)\(sb-sa=res\) 那么可以直接对应从小到大将 \(A\) 中的数依次修正为 \(B\),删的一定是前面 \(res\) 个。否则我们需要浪费次数,贪心,需要浪费时去操作 \(A\) 的最小值。

用俩 multiset 实现了一个对顶堆一样的玩意维护前 \(m\) 大。时间复杂度 \(\mathcal{O}(n\log n)\)

Code

J The Phantom Menace

好难写...枚举第一个串的偏移量,然后建图跑欧拉回路 \(a_i[1,d]\to a_i[d+1,m]\)\(b_j[1,m-d]\to b_j[m-d+1,m]\)。注意这里是一个二分图要区分左右部点(因为 \(d=m/2\) 的时候可能有些问题?),需要哈希,时间复杂度 \(\mathcal{O}(nm)\)

Code

SNOI 2019

P5330 [SNOI2019] 数论

\(\operatorname{lcm}\) 为循环的整段直接算,只考虑最后那个散段咋算。首先按 \(\bmod \gcd(P,Q)\) 分类转化到 \(P\perp Q\) 的情况,考虑 \(0,P,2P,\cdots (Q-1)P\)\(\bmod Q\) 意义下是一个环,不重不漏取遍 \([0,Q)\),并且每次询问的是这个环的某一段有多少个 1,对这个环作一个前缀和就行。

Code

P5331 [SNOI2019] 通信

先想到费用流,尝试建模:

  • \(S\)\(i\)\((1,0)\):追踪这个流的流向来确定 \(i\) 作为何种方式贡献答案;
  • \(i\)\(T\)\((1,W)\):直接取。
  • \(i\)\(j'\)\((1,|a_i-a_j|)\) 其中 \(j<i\):连接到前一个哨站。
  • \(j'\)\(T\)\((1,0)\) 限制至多和后面一个哨站连接。

这里的问题是 \(i\to j'\) 的边数在 \(n^2\) 级别,尝试优化建边,这种左侧和右侧相连的形式可以联想到 cdq 分治。于是分治的时候变成右半部分向左半部分连边,对每个值单独建点,相邻的值连边 \((+\infty,|\Delta|)\),就能将这部分边优化到 \(\mathcal{O}(n\log n)\) 条了。

Code

P5372 [SNOI2019] 积木

初始图 \(G_s\) 与最终图 \(G_t\) 的对称差 \(G\) 一定是若干环加上一条链,并且这条链是以 \(G_s\) 中的空格出发,走到 \(G_t\) 中的空格。需要找到这样的路径满足:

  • \(G_s\) 中走过的边的状态是 1010101010....10(一条边走过之后 0,1 互换)
  • \(G\) 中的 1 边被走奇数次,0 被走偶数次

首先先走完那条链归约到只有环的情况。然后从空格处开始 dfs,每次 dfs 尝试走上下左右的积木,然后根据这个积木的形态再走到下一个格子(也就是一次 dfs 走两步),已经走到过的点打个标记以后不要再重新走。如果当前走到了一个环内就绕一圈回来把这个环修正(注意这一步修正环不要打标记)。

先将网格图黑白染色,每走两步空格只能走到同色点。只需证明 dfs 的过程中空格空格走偶数步能走遍所有的同色点即可。这样就能保证每个环都能被遍历到,从而所有环都可以被修正好。

assert 一下发现没问题那它就是对的 只需讨论出一个点能够走到它所有曼哈顿距离为 2 的点就行,不想讨论可以直接搜一下 5*5 的所有情况程序验证?所以还真是 assert 一下是对的它就是对的。

Code

InfOJ NOIP2023 模拟赛

A 机器人吃东西

观察产生贡献的区间之间形成了一个树的形态,于是可以直接无脑区间 dp,\(f_{l,r,x}\) 表示 \([l,r]\) 最终剩余的数按位与为 \(x\) 时最大值,转移为 \(f_{l,k,x}+f_{k+1,r,y}\to f_{l,r,x\&y}\) 以及 \(f_{l,r,0}+1\to f_{l,r,63}\)。这样复杂度就是 \(\mathcal{O}(n^3V^2)\) 常数很小可以通过。

Code

B 机器人的积木

贪心是优先削宽度最短的峰,削完之后会合并连续段。写个并查集链表啥的对每个 \(i\) 处理出来 \(s_i\) 表示一共能削几次宽度为 \(i\) 的峰,然后就很好算答案了。

Code

C 机器人填数

如果有 -1,可以延后到没有 -1 的时候再计算。需要往上传不是 -1 的子树拿个 vector 启发式合并就行,现在只需要解决 \(f\) 均不是 -1 的情况。考虑二项式反演,枚举 \(i\) 个颜色没有出现过,首先一堆没有限制 -1 的散点是 \(cnt^{f(x)-i}\),然后各个子树是 \(\prod dp(v)\binom{f(x)-i}{f(v)}\),再乘上 \((-1)^i\binom{f(x)}{i}\) 的系数贡献到答案。剪枝一下 \(i\) 只枚举到 \(\min\{f(x)-f(v)\}\),这样剪枝之后复杂度分析是就可以借助重链剖分了。

对于每个 \(x\) 对复杂度的贡献是 \(\min\{f(x)-f(v)\}\deg(x)\),会被菊花图卡掉。注意到 保证有解说明 \(f_x\leq size_x\),说明 \(f(v)\) 相同的 \(v\) 可以合并到一起进行计算,这样只会剩下根号个不同的。

借助重链剖分分析出的一个log还有快速幂一个log估出来一个上界 \(\mathcal{O}(n\sqrt n\log^2 n)\),快速幂的 log 好像可以用这个 T1分析掉但我不会。好像说 127 分析出来重链剖分的那个 log 也能分析去掉,我也不会。

Code

D 操作

观察个性质,如果用了一个操作让 \(a_{X}\) 减了,那么一定会一直用这个操作让 \(a_{X}\) 减到 0。那么就相当于选出一些操作来,从而得到每让 \(a_{X}\) 减 1 就要让 \(a_{L}\sim a_{R}\) 的减 \(1\),再多出 \(+W\) 的代价。

于是 \(dp_X=\min\{b_x,W+\sum _{L\leq i\leq R}dp_i\}\) 这样一个 dp,用最短路的方式转移就行。具体实现上我写了个对每个右端点用 set 存左端点,用并查集合并连续段,同时 set 启发式合并。时间复杂度是 \(\mathcal{O}(n\log ^2n)\)(当然 set 启发式合并换成线段树合并就是一个 log 了但我懒了没写)。

Code

SNOI 2020

P6790 [SNOI2020] 生成树

复习一些知识点:

细分:在一条边中间添加一个点,也就是删去 \((x,y)\) 再加入 \((x,a),(a,y)\)

同胚操作:在原图的边上增加或者删除度数为 2 的结点,不会影响图的平面性。

同胚:\(G_1\)\(G_2\) 可以通过同胚操作转化为同构的图则称这两个图同胚。

平面图(库拉托夫斯基定理):一个图是平面图当且仅当不存在同胚于 \(K_5\)\(K_{3,3}\) 的子图。

(下面是正题)

广义串并联图:不存在同胚于 \(K_4\) 的子图。

性质:

  • 能通过三种操作(广义串并联图方法):缩一度点,缩二度点,叠合重边,最终变成单点。
  • 是平面图(\(K_5\)\(K_{3,3}\) 均存在同胚与 \(K_4\) 的子图)
  • 最终所有点度数 \(\geq 3\)\(2m\geq 3n\),并且操作过程中 \(k=m-n\) 不会增加,所以当 \(m\leq n+k\) 时最终有 \(n\leq 2k,m\leq 3k\)

发现 \(K_4\) 删去任意一条边之后都不会成为仙人掌,所以仙人掌加一条边一定是广义串并联图。假设一条边连起来的方案是 \(f\),断掉的方案是 \(g\),不断运用广义串并联图方法更新 \(f,g\) 即可。

Code

P6791 [SNOI2020] 取石子

anti-game 没有用,能取到 \(n-1\) 的必胜,不能取到 \(n-1\) 的必败,所以现在考虑取走最后石子获胜的情况。

对于一个 \(n\) 来说合法的 \(k\) 一定是一个前缀,并且一定是贪心取最小的(留给对方的机会更小),所以启发将每个 \(n\) 最小的合法的 \(k=a_n\) 打出表来,找到最小的 \(j\) 满足 \(a_{i-j}\leq 2j\) 即为 \(a_i\)

找规律发现是前 \(f_i\) 项是将前 \(f_{i-2}\) 项拼到第 \(f_{i-1}\) 项最后,并将最后的改成 \(f_i\)。如果感觉不出来这是啥也可以考虑斐波那契博弈和斐波那契进制有关,进而感受到 \(a_n\) 就是 \(n\) 在斐波那契进制下的 lowbit。

如何证明?直接归纳就行。首先 \(a_1=1\) 成立。对于 \(n>1\),记 \(low(n)\)\(n\) 在斐波那契进制下的 lowbit,则有:

  • 取的石子 \(x<low(n)\):首先对于固定的 \(low(n-x)\),取得石子越少越优,考察留下的最多是多少,假设 \(low(n)\) 斐波那契进制表示是 100000,那么最优的是 010000,001000,010100,0010100,010101 这样的形式,往上每隔一位将其置为 1。此时 \(x\) 就是 \(low(n-x)\) 在斐波那契序列中的上一位,那么显然有 \(low(n-x)\leq 2x\)
  • 取的石子 \(x=low(n)\)\(low(n-x)>2x\)(因为斐波那契进制下不会有相邻的两个 1)。

至此可以证明 \(a_n=low(n)\)。剩余的 dp 前缀和之类的东西就没啥好说的了(

Code

P6793 [SNOI2020] 字符串

加个不可识别字符拼起来再后缀排序之后利用 LCP = height 区间 min,将 Kruskal 重构树建出来,两个叶子进行匹配越靠下越优。所以按照 height 贪心从小往大合并就是对的。

Code

SEERC 2022

I Inadequate Operation

对于 \(\geq x\) 的数形成的若干连续段,将它们从 \(x\) 消到 \(x-1\) 至少需要 \(\sum \lceil\frac{len}{2}\rceil\) 次操作。另一方面这个也能构造出来,对于每个奇数段让它最左边那个和左边那个 \(<x\) 的一起消。这样唯一的问题是可能会使得 \(\geq x-1\) 的数多了一个,但发现这个时候都是在奇数段左边多了一个,即使甚至会造成段的拼接,\(\sum \lceil\frac{len}{2}\rceil\) 的值依然不会变。实现上仅需从大到小排序之后用链表维护每个位置左/右第一个 \(<x\) 的位置。

Code

E Exercise

首先膜拜颜熙,如果没有颜色相同不能匹配的限制,答案是从小往大排序然后相邻匹配。首先需要意识到,若不管颜色的限制,无论匹配长什么样子,第 \((2i-1)\) 个和第 \(2i\) 个点中间的间隔(也就是第奇数个间隔)一定是要贡献到答案中一次的(对于一对匹配小的视作 (,大的视作 ),那么前缀和 \(>0\) 的一定至少贡献一次)。

基于这个结论,再考察第偶数个间隔哪些要贡献到答案里,与上文同理,它们如果对答案有贡献那么至少贡献两次。

现在考虑相邻匹配之后如果有一对匹配颜色相同,那么它们可以和左侧互换,将左侧的间隔 \(\times 2\) 贡献给答案;或者和右侧互换。

  • 也就是对于一对颜色相同的相邻匹配,它左侧和右侧的间隔至少有一个要贡献到答案里面。(必要)
  • 如果确定了一些第偶数个间隔是贡献到答案并且满足上面那个限制也容易直接构造出来合法的方案(充分)

这样就是充要条件,同时上文已经证明最优解一定是这种形式。最后的 dp 就简单了 \(f_{i,0/1}\) 表示考虑了前 \(i\) 个间隔,第 \(i\) 个间隔有无选的最小答案即可。

Code

K Knowledge Testing Problem

考虑分治,对于跨过 mid 的询问一定会经过 mid \(\pm 10\) 的点,从它们开始跑最短路即可。同时往左右递归的时候,路径会经过子区间外面的点,但是一定会经过 \(\geq l-10,\leq r+10\) 中的点,而它们在父区间中就是 mid 旁边的点,已经从它们开始跑出最短路,用这个最短路更新一下边表,在子区间跑最短路的时候把区间外的 10 个也拉进来一起跑就行。

Code

CCPC 2023 秦皇岛

B Yet Another Subsequence Problem

板子题咋现场过得这么少...... \(y=\frac{ax}{b}\)\([0,b)\) 以内,遇到横线就 push_back 一个 0,竖线 push_back 1。然后万欧搞那个 dp 本质不同子序列个数的矩阵就行。

Code

C Palindrome

对询问 \([l,r]\) 求出 \([l,p),(q,r]\) 是两边能往里扩展的最长长度。那么留下来的最优一定是 \([l,p)\)\((q,r]\) 以及 \(p\) 开头或者 \(q\) 结尾的一个回文串,求最优解可以回文树上倍增。第二问就看这个回文串能往外扩展多少,也是二分 + 哈希求就行。

另解:第二问直接就是 manacher 跑出来的数组。第一问考虑相当于需要求出以 \(p\) 开头且结尾 \(\leq q\) 的最长回文子串,那么回文中心一定在中点 \(mid=\frac{p+q}{2}\) 左侧,求 \([p,mid]\)\(x-len_x\leq p\) 的最大的 \(x\) 即可,seg 上二分解决。

怎么哈希都能写挂/no Code

M Inverted

观察一下树形态,实际上就是标记点都往上复制一下,复制之后的点内部有连边,然后每个标记点的复制点连向相邻的未标记点。\(f_x,g_x\) 表示 \(x\) 子树内部生成树个数,其中 \(x,x+n\) 是否已经连起来,每次 \(\mathcal{O}(n)\) dp 就行。

Code

posted @ 2023-11-09 21:22  do_while_true  阅读(90)  评论(1编辑  收藏  举报