做题记录(May)
5.3
AT_arc218_b
比较简单的博弈题,其实样例把所有情况都告诉你了。(除了初始的 \(0\))。
先看开始的 \(0\),如果有多个,则 Alice 可以任选先后手(留 \(0/1\) 个 \(0\)),则 Alice 必赢。
否则如果有一个,交换先后手。(后面就都说先后手了,因为不知道是谁)。
如果是第三组样例(1 2 3 4...) 这样的情况,发现先手只能每次 \(-1\),然后后手删一个 \(0\),后手必胜。
如果先出现了连续相同数(1 2 3 3 4 6... 或第二组样例 1 1 1),那么先手只能依次 \(-1\) 后留多个 \(0\) 给后手,则后手必胜。
如果先出现了不连续的正整数(1 2 4 5... 或第一组样例 2),则先手可以选择把这个数减成 \(0/1\),则先手必胜。
总结:谁能自由选择接下来的先后手谁赢。
5.4
P5122
一种做法:先从 \(n\) 点跑出当前最短路,然后用一个新的源点 \(n + 1\) 连上所有草垛,边权设为原最短路减去草垛数值,再跑一遍,比较两遍最短路。
5.5
P9220
傻博弈题。
首先缩点。若 Alice 想赢,拓扑的时候遇到的拓扑序最低的黑点必须是它选的点。把这个点出发到得了的点翻一遍,判断一下是否只有白点即可。
对于 Bob,想赢有两种情况,一种是全白点,一种是只有两个点且 Alice 没有赢。
P7518*
先把树上点的颜色全部换成收集顺序中的位置。
考虑看起点到 lca 的路径上和终点到 lca 的路径。在第一次遍历树时把往上跳时位置下标 \(\pm1\) 的和等于一的(起点)全部找出来,这样就可以知道起点到 lca 的答案。再二分一下后半段能到哪里,可以把询问离线下来放到终点上做。
5.6
CF546E
打 duel 偶遇网络流,被旁边同学瞪出来了。
建边方式:把每个点拆成两个,从源点向所有 \(1\sim n\) 连一条容量为 \(a_i\) 的边,从 \(1\sim n\) 向对应的 \(n+1\sim 2n\) 连一条容量为正无穷的边,从 \(n+1\sim 2n\) 向汇点连一条容量为 \(b_i\) 的边。对于原图上的边 \(x\rightarrow y\),连一条从 \(x\) 到 \(y+n\) 容量为正无穷的边。
这样保证了每个点最开始只会有 \(a_i\) 个人,结束时最多有 \(b_i\) 个人,只能延原图的边走一次。
判断一下最大流和 \(\sum b_i,\sum a_i\) 相不相等,最后根据残量网络输出一下方案即可。
CF2224
A
从后往前,是正数就加。
B
考虑前面的数是从零开始的连续非负整数和一个最大值,枚举在哪个位置插入最大值,算答案取最大值。
C
先把左括号看成 \(1\),右括号看成 \(-1\)。
神秘结论:两个串加起来前缀和为 \(0\) 的位置下标都为偶数,且没有为负数的时候。总和也为 \(0\)。
D
难点:注意到 \(n\le 2000\)。
把式子写成 \(a_ib'_i>a_jb'_j\),然后把问题转化为对于每一对 \(a_i,a_j(i<j)\),有多少对 \(b_x,b_y\) 满足 \(a_ib_x>a_jb_y\),也就是 \(\frac{a_i}{a_j}>\frac{b_y}{b_x}\),那么对于每一对 \(i<j\),把 \(\frac{a_i}{a_j}\) 排序,对于所有 \(i\ne j\),把 \(\frac{b_i}{b_j}\) 排序,双指针求一下,除以 \(n(n-1)\) 即为答案。
CF906D*
神秘的扩展欧拉定理。
注意到指数第一层对 \(\varphi(m)\) 取模,第二层对 \(\varphi(\varphi(m))\) 取模,\(\log m\) 层 \(\varphi\) 就只有一了,所以暴力求每一层的指数,注意取模的时候要先考虑一下会不会影响上一层在扩展欧拉定理的时候的指数。
5.7
P1495*
CRT 板子,也算作复习 exgcd。
P4777*
EXCRT 板子。
P4139
同 CF906D。
P6478
偏板一点的二项式反演。
令 \(f_{i,j}\) 为以 \(i\) 为根的子树中,钦定 有 \(j\) 对非平局的情况数,\(g_i\) 为整棵树中 恰好 有 \(i\) 对的情况。
则反演可得: $$g_i=\sum_{j\ge i}\binom{j}{i}(-1)^{j-i}f_{1,j}(\frac{n}{2}-j)!$$
\(f_{i,j}\) 可通过树形 DP 求得。
P4921
令 \(f_{n,i}\) 为总共 \(n\) 对情侣且 钦定 \(i\) 对位置配对,则有:$$f_{n,i}=\binom{n}{i}^2i!\times 2^i\times (2n-2i)!$$
令 \(g_{n,i}\) 为总共 \(n\) 对情侣且 恰好 \(i\) 对位置配对,则有:$$g_{n,i}=\sum_{j=i}^n \binom{j}{i}(-1)^{j-i}f_j$$
但如果所有 \(g\) 反演,会超时。发扬人类智慧,$$g_{i,j}=\binom{i}{j}^2j!\times 2^j\times g_{i-j,0}$$
这样我们就可以只用反演求出所有 \(g_{i,0}\),然后 \(O(1)\) 求其他的。
5.8
CF1968F
显然若区间异或和为零,可以随便搞,否则每一段的异或和都为总异或和,二分找一下有没有这样的分法即可。
CF1891F
先离线把树全建出来,加也直接给子树加,然后操作时到加某个点的时候再清空那个点。
CF616E
怎么还有整除分块板子。
5.9
P2303
设 \(\gcd(n,i)=d\),则可以改成求对于每一个 \(d\),有多少个 \(i\) 满足 \(\frac{n}{d}\) 与 \(\frac{i}{d}\) 互质,且 \(1\le i\le n\),也就是 \(\varphi(\frac{n}{d})\),所以答案为:$$\sum_{i|n}i\cdot\varphi(\frac{n}{i})$$
CF594A
不管 ban 的顺序,无论如何,先手只会把头尾的一段 ban 掉,否则肯定不优,而中间剩的对手只会留一头一尾,这样最大。所以枚举先手留下那一段即可。
CF717G
费用流,又被同学瞪出来了。。
连边方式:原串中每个字符一个点,匹配了串的位置又开头向结尾的下一个位置连一条边,容量为 \(1\),费用为匹配上的串的价值。然后从 \(0\) 到 \(n+2\) 依次连上容量为每个位置最大覆盖次数,费用为 \(0\) 的边。
5.10
AT_arc219
A
枚举 \(1\sim m\) 位,看当前没有匹配上任何一位的串当前位是啥,统计数量,谁多答案的这一位就是谁,这样每次至少排掉一半。
B
如果 \(p_i \ne i\),那么怎么转都不对,直接退出输出答案,否则答案加上 \(n-i\)。特别的,如果串就是 \(1\sim n\) 排好序,还要再加一,表示不转的情况。
5.11
CF671B
暴力瞎搞搞。把硬币数相同的人放一起考虑。每次考虑把最小值全部推成次小值或把最大值全部推成次大值或把次数用完。对应搞一搞,注意下常数。
P9127
想了半天怎么最后是暴力啊。。。把每个区间取出来按和排序,然后对于区间里的所有数,枚举过去,看一看左右和最近的区间包不包含这个数,不包含就更新答案。
CF1969E
不想写了,看第一篇题解吧。。。
5.12
AT_abc280_f
若在两个连通块中,则是 nan。
若在同一个连通块中,若此连通块中有环且不是零环,那么正着走反着走总有一个方向是正环,输出 inf。
否则,这个零环不会影响答案,把它当成树求距离即可。
CF1632D
维护当前右端点到前面的任意左端点的 \(\gcd\),因为 \(\gcd\) 的性质,可以将这个序列分成若干段,每一段的 \(\gcd\) 都一样,这样段数很少,因为越往前面 \(\gcd\) 肯定变小,每次至少减半。加入一个数时,更新每段的 \(\gcd\),将更新后相邻的 \(\gcd\) 相同的区间合并,然后检查有无不合法情况,有就答案加一,删除所有前面的区间,左端点的起点从下一个点开始,因为将这一个点修改后可以使跨过此点的区间 \(\gcd\) 恒为一(例如取一个大质数),前面的区间又已经合法,那就只用看后面的了。
P2809
何意味暴搜啊,几乎没怎么剪枝。
5.13
P9019
看题解吧。。
P9149
首先可以删的数就是 \(b\) 里没有的数。
考虑 KMP,在 \(a\) 中 忽视可以删的数 匹配到一个串,那么这个串的贡献就是把中间可以删的都删了,再从其他可以删的数中选出几种补齐 \(d\) 的方案数。也就是假如这个串中间夹了 \(k\) 种可以删的数,\(b\) 中有 \(cntb\) 种数,则贡献为 \(\binom{w-cntb-k}{d-k}\)。可以在 KMP 的同时记录一下当前匹配的串中间夹的数。
P2197
Nim 游戏板子,牛牛牛。
AT_arc219_d
神秘的博弈。
对于 \(i+j\) 为偶数的格子(下简称偶数格子,奇数格子同理),每次挪动到奇数格子后另一人都可以再将其挪动到另一个偶数格子上,所以偶数格子上的棋子实际是没有影响的。
那么对于奇数格子,我们只需要把上面的石子挪到偶数格子上,那么就可以把问题等价转换为 从若干堆石子中,每次选一堆取出 \(\left[1,k\right]\) 个石子,问谁最后把石子取完。这样的话可以先让每次先后手一回合拿走 \(k+1\) 个石子(类似巴什博弈),然后就是 Nim 游戏了。
所以所有奇数格子的石子数对 \(k+1\) 取模后异或起来,为 \(0\) Bob 赢,否则 Alice 赢。
5.14
CF1691F
神秘的换根 DP。就是换根的时候改起来有点麻烦。
CF1906F
我说我不会线段树了。。。
考虑枚举 \(1\sim n\),同时维护一个数组 \(b_i\):若当前枚举的位置会被第 \(i\) 次操作修改,则 \(b_i\) 为此操作的值,否则为 \(0\),这样对于每一个位置的询问,在线段树上做区间最大子段和即可。
维护也很简单,记录下某个操作在哪个位置开始生效,哪个位置后无效,在线段树上单点改即可。
CF1706E
kruskal 重构树,然后用类似 NOIP 2024 T4 的暴力方法 ST 表求区间 LCA。
CF1294F
何意味,这是蓝?直接取直径和离直径最远的点。
5.15
- 身体问题,居家。
- 严肃阅读 洛谷文章,所以今天做的题讲解看这里就可以了。
P1866
我不会橙题。/ll/ll/ll
P5220
我不会黄题。/ll/ll/ll
P1313
注意对初始的 \(a,b\) 取模。
P2822
我是弱智。
5.17
P7622
差点不会黄题了。发现他只会先左后右或者先右后左,不会回头两次,所以乱搞即可。
P7165
枚举一个子树,然后用 multiset 记录其他子树的大小,二分寻找使得除去这个子树后尽量平分的方法。
AT_arc220_a
发现 \(\frac{1}{x^2}=\frac{4}{(2x)^2}\),也就是可以把一个数拆成四个,所以模三同余的可以看作同一个起点,一直拆就可以了。
5.18
P10814
离线二维数点板子。
P3787
维护一下从根到每个点的前缀积,那么在 \(x\) 点加 \(\Delta val\),对于其子树内的点 \(y\) 的贡献是 \(\Delta val\cdot\frac{d_y}{d_x}\),\(d_y\) 是每个点自己的,可以提出去,然后就变成子树区间加了。注意处理一下边权为 \(0\) 的地方,说明上下没关系,应该把子树拆下来。
5.19
P5389
数学题。
P12448*
数据结构好题。考虑用线段树维护答案数组(\(s_k\) 表示 ? k 的答案)。
从每个点作为最大值的贡献这个角度看,假设一个点 \(i\) 为(唯一)最大值,那么显然它左右第一个大于等于的点(\(pl-1\) 和 \(pr+1\))中间(\(\left[pl,pr\right]\))就是它做贡献的范围。
假设它到左端点的长度为 \(lenl=i-pl+1\),到右端点的长度为 \(lenr=pr-i+1\),总长为 \(len=lenr+lenl-1=pr-pl+1\)。
如果 \(lenl<lenr\),需要的区间长度为 \(x\):
- \(1\le x\le lenl\),那么长度为 \(x\) 就有 \(x\) 个区间包含 \(i\),则贡献为 \(a_i,2a_i,3a_i,\cdots lenl\cdot a_i\)。
- \(lenl< x\le lenr\),此时长度为多少都是刚好 \(lenl\) 个区间,贡献为 \(lenl\cdot a_i\)。
- \(lenr< x\le len\),此时刚好和第一种情况反过来,贡献为 \((lenl-1)\cdot a_i\cdots a_i\)。
\(lenl>=lenr\) 同理,那么这个问题就拆解为了三个区间加等差数列,线段树上维护差分即可。
回到题目,我们可以先从大到小把初始序列中的数的贡献放进来,然后更新时,找到这个点 \(+1\) 过后对那个区间有贡献,和上面同理。至于找左右第一个大于等于的数,线段树二分即可。
总结:维护两颗线段树,一颗存答案,区间修改区间查询,一颗用于线段树二分,单点修改。
P6406 & SP22343*
做法一:拆贡献 \(r-l+1 \rightarrow (r+1)+(-l)\),算每个点是左端点时的答案和是右端点时的答案,线段树动态维护,区间推平 \(\min,\max\),区间求 \(\min\cdot\max\) 和。
5.20
做法二(没错昨天那个题):CDQ 分治,分类讨论最大值,最小值分别在左在右的四种情况,使用双指针之类的算一下答案。
P3810*
CDQ 板题。
P6348*
线段树优化建图板子。
5.21
CF786B
线段树优化建图板子。
P5025
先线段树优化建图,然后缩点。本来 DAG 上的可达性是 \(O(n^2)\) 的,但是这题特别的是可达的点一定是一段区间,所以只需要建反图拓扑找一下能到的最大最小点就可以了。
P14593 & CF1601D
神秘的 Ad-hoc,贪心容易假。神秘分讨一下 \(a_i,b_i,a_j,b_j\) 之间的关系,发现正确的贪心方式:先按照 \(max(a_i,b_i)\) 从小到大排序,再按 \(a_i\) 从小到大排序,最后按 \(b_i\) 从小到大排序,然后模拟。
P14662
被 Ad-hoc 吓哭了,自己看题解吧。/ll/ll/ll
CF2231
A
从小到大合法就塞。
B
在所有需要加的地方取个需要的 \(\max\),然后按顺序需要加就加,看合不合法。
C
有个显然的东西就是每个数进入 \(1\rightarrow2\rightarrow 1\rightarrow\cdots\) 的循环需要 \(\log\) 级别的次数,所以考虑记录下所有数变成 \(1\) 的路径中经过的点总共被经过几次和经过时的路径长度和。
但是全记录的话 map 常数太大会 T,所以加个小优化,只保留第一个数的路径上的数,其他数不扔进 map。
特别的,\(1\) 要额外走到 \(2\) 一次,不然样例都过不了。
5.22
P5691
折半搜索板子。
P6091*
原根板子。
P3846*
BSGS 板子。
5.23
P4884
把一堆 \(1\) 转换成 \(\frac{10^k-1}{9}\) 就是 BSGS 板子了。
5.24
P3306
我不会推式子/ll/ll/ll。
P13343
先有一个比较显然的贪心策略:先看哪个方向平行的(摆好的)最多,然后把所有不平行的都往这个方向上摆。
然后考虑如何摆,建议的摆放策略就是摆好一条线后把因为转这条线重合的另一条线马上转走,然后循环到没有重合位置,这样转就可以看作在若干个环上走一圈。这样摆绝对不会冲突,也证明了这样贪心是正确的。
5.25
P14231*
一天卡一道题,已去世。
大概意思就是二分答案,然后看序列中,小于等于答案的一半的数都选进来,大于等于一半的数,每两个小数中间只能选一个最小的,并且要满足要求。
预处理一个 \(b_i=\min(2a_i,\max(a_{l_i},a_{r_i})+a_i)\),然后通过主席树等方式快速查询,这样是 \(\log^2n\) 的,正解单 \(\log\) 应该是整体二分,等我学一下。
5.26
- 打 APIO 模拟(复现)赛,被 T1 20 分状压搞死,极限过 T2 56分,坠大机。
P16434
APIO2026 T2,神仙 Ad-hoc 交互。
sub1
瞎搞,我直接用的 sub3 的方法。出题人的想法应该是塞很多个 \(1\) 然后二分。
sub2
多种解法,我是塞两个 \(1\)。
sub3
塞入 \(2^0,2^1,2^2,\cdots,2^{29}\),然后你发现一个前缀如果大于下一个数,那么就说明前缀里有那个特别的数,然后在找到的范围里二分答案并用二进制凑出来检验。
如果枚举从前往后枚举前缀或者二分前缀会超一点,正解是从后往前枚举前缀,这样枚举前缀的次数和之后范围二分的次数加起来刚好是单 \(\log\)。
sub4
\(3^7=2187<2000+200\),所以考虑三分。
选择 \(mid1 = \frac{2l+r}{3},mid2=\frac{l+2r}{3}\),然后发挥人类智慧,查询 \(l,r\) 和 \(mid1+mid2\),因为答案如果在第一段,则 \(mid1,mid2,r\) 比预想的小 \(1\),查询结果是大于;答案如果在第二段,\(mid2,r\) 比预想的小 \(1\),查询结果是等于;答案如果在第三段,\(r\) 比预想的小 \(1\),查询结果是小于。这样就区分开了。
5.27
P14230
补模拟赛,T3,依旧卡常。神秘 DP,无法战胜。
P1527*
整体二分板子。
P3527 & SP10264*
整体二分板子 2。
P3803*
学习 NTT。
5.28
P4238*
多项式求逆板子。
P4725*
多项式求 \(\ln\) 板子。
P5205*
多项式开根板子。
P4726*
多项式求 \(\exp\) 板子。
51Nod 1728*
EGF 的应用。
5.29
P4245
任意模数多项式乘,三模 NTT 板子。
P4239
任意模数多项式逆板子。
CF623E*
三模 NTT + 倍增。
5.30
P13504
求一下每个点出发能领多少,倍增。

浙公网安备 33010602011771号