2月补完计划(上)
指的是被答辩题目填满的计划🤗被填满之后就可以在3月退役啦😄😛🥵
[AGC006F] Blackout
Solution
哈哈哈啊哈哈哈,tmd对着环跟链找规律什么都看不出来😅😅😅又被染色题橄榄啦,哈哈哈哈哈哈🤪🤪🤪
我们可以先转到图上面,即是如果有边 \(x\to y\) 以及 \(y\to z\),则有 \(z\to x\),问最后的边数。我们考虑三染色,即如果存在边 \(x\to y\),则 \(v_x=v_y+1\pmod{3}\)。然后可以发现边只在弱连通块内部产生。对于一个若连通块考虑,如果只有两种颜色,那么显然是不会增添任何边。然后考虑三种颜色都有,那么可以发现相邻颜色一定两两产生边,证明可以用归纳法,这里不赘述了。对于无法三联通的块一定两两有变,跟上一种情况情况差不多的考虑。
其实只要想到三染色的话直接找规律就不会特别难做。但是我是%@#\(%#@\)#@(&@!fsfaa$#@😝😝😝
[AGC007C] Pushing Balls
Solution
完全不会做🥵🥵🥵完蛋力😥😥😥
我们考虑当前状态为 \(<n,d,x>\),发现每次期望贡献为 \(d+(2n-1)/2\),期望变为状态 \(<n-1,(2d+5x)/(2n),x+2x/n>\)。问题就是需要注意到可以状态转移的自变量可以是期望的,因为产生贡献是线性的。更重要的是,需要想到去找规律。🙂
哈哈哈哈哈哈哈哈,需要找规律的时候就不找🤡🤡🤡这就是若只,给他一点小小的震撼😏😏😏
CF1684G
Solution
哈哈哈哈哈哈哈哈,做不出来😛🥵🤪
很有意思的题目,有点像脑筋急转弯/kk 我们发现对于 \(\le \dfrac{m}{3}\) 的点 \(a\),我们可以构造 \((3a,2a)\) 去处理掉。然后考虑 \(>\dfrac{m}{3}\) 的 \(a\),我们发现假设上一个为 \(b\),那么一定会有 \((2a+b,a+b)\)。注意到这是合法的,所以有 \(b\le \dfrac{m}{3}\),也就是说我们需要将 \(\le \dfrac{m}{3}\) 的与 \(>\dfrac{m}{3}\) 的点进行匹配。
注意到可能会有中间节点,不过中间节点如果合法一定需要 \(\le \dfrac{m}{3}\),那我们完全可以只保留开头和结尾,这样一定最优。然后就是一个二分图匹配的形式了。
[AGC007E] Shik and Travel
Solution
哈哈哈哈哈哈,这也做不出来🥰🥰🥰
不难想到我们可以先二分,然后再考虑判定。一种暴力的想法是,我们设 \(f_{u,a}\) 表示长度为 \(a\) 的进入 \(u\) 的一个叶子出来的叶子到 \(u\) 的最小距离。然后直接暴力转移。复杂度是 \(\mathcal O(n^2\log n)\) 的。
我们考虑实际上有多少个有效状态。可以注意到的是,我们设 \(g_u\) 表示 \(u\) 子树内的有效状态。假设它的两个儿子为 \(L,R\),那么 \(g_u=2\min (g_L,g_R)\)。这是因为对于较小的一边,它的每个状态要么作为进去的叶子要么作为出去的叶子。所以状态总数就是 \(\mathcal O(n\log n)\) 的。
合并的时候可以归并做到 \(\mathcal O(n\log n\log v)\),当然也可以偷懒写个 \(\mathcal O(n\log^2 n\log v)\)。
CF986F Oppa Funcan Style Remastered
Solution
不会同余最短路/kk 😨😨😨
我们可以先把 \(K\) 质因数分解,如果质数个数 \(\le 2\),那么可以直接 exgcd 处理。然后如果质因数个数 \(\ge 3\),那么最小的质数 \(p_0\) 一定 \(\le 10^5\)。要判断能否用这些质数构造出 \(n\),我们可以考虑同余最短路,即设 \(f_x\) 表示 \(\equiv x\mod{p_0}\) 所需的最小和,那么答案即是 \([f_{n\mod{p_0}}\le n]\)。
质因数分解直接来就好了,不需要 Pollard_rho。
[AGC008E] Next or Nextnext
Solution
可做题,但是情况太多太复杂就很难处理好。😵😵😵 因为需要图,这里就不写题解了,litble的博客倒是挺好的 。
luogu P5172 Sum
Solution
哈哈哈哈哈,啥也不会🤪🤪🤪
我们考虑到 \((-1)^x=1-2(x\mod{2})\),那么我们把 \((-1)^{\lfloor d\sqrt{r} \rfloor}\) 就可以替换成:\(1-2(\lfloor d\sqrt{r} \rfloor)\)。又注意到 \(x\mod{2}=x-2\lfloor \frac{x}{2} \rfloor\),那么我们即是求:
这个玩意就可以直接拓展欧几里得算了。哈哈哈哈,但是我啥也想不到,哈哈哈哈哈哈😏😏😏
CF1656H Equal LCM Subsets
Solution
绷,啥也做不来😚😚😚
我们首先考虑都是一个素数的幂的时候怎么做,假设都为 \(p^{\alpha_i}\),那么一开始我们把 \(sA,sB\) 都设为全集,如果 \(\alpha_i\) 最大值相同,那么就结束了。否则我们可以弹出最大值更大的那一个,因为不弹出的话一定不合法,然后继续递归处理。
我们考虑不都是一个素数的幂的时候怎么做。还是一开始把全集都加进去,然后如果一个数存在一个质因子使得其指数比另一个集合的最大值大,那么显然就需要删掉它。当没有需要删的时候,显然就合法了。我们把判定式写出来,即:
\(x\) 就是我们需要删掉的数。这个东西可以用线段树维护一下,复杂度是 \(\mathcal O(n^2(\log n+\log v))\) 的。
[AGC009D] Uninity
Solution
智力检测题,很可惜我是shaber🧐🧐🧐
可以看出答案一定 \(\le \log n\),因为我们可以每次选重心递归下去。然后考虑如何构造到最小值。换一种角度思考,其实相当于我们给每个点赋权一个 \(\text{lab}_u\),要求任意 \(u\not= v,\text{lab}_u=\text{lab}_v=k\),\(u\to v\) 的路径上存在 \(\text{lab}_x>k\)。这个是可以显然的。
那么我们考虑从叶子往上考虑,那么每次考虑当前节点一定会选一个能选的最小值,这样一定最优。又注意到我们从小往上是不断匹配的过程(匹配指出现一个祖先使得一个点一定合法),而我们也只关心哪些 \(\text{lab}\) 值没有匹配,那么我们可以假设 \(s_x\) 为考虑了 \(x\) 子树后还没有匹配的 \(\text{lab}\) 集合。那么对于 \(u\) 来说,\(\text{lab}_u\not\in s_v,v\in \text{son}_u\),否则到 \(u\) 的路径是不合法的。然后显然 \(\text{lab}_u\) 会比 \(s_{v_1}\cap s_{v_2},v_1\not= v_2,v_1,v_2\in \text{son}_u\) 的最大值大。那么二进制算一下就好了,然后 \(s_x\) 也可以直接推出来。
复杂度 \(\mathcal O(n)\)。这个题的难点就在于想到转化后的题意,后面贪心的部分倒不是很难。但我还是没有做出来😤😤😤
[AGC010D] Decrementing
Solution
这下我是侦破方腊哈哈哈哈哈😏😏😏
我们可以看出的是如果一开始最小值为 \(1\),那么 \((\sum a_i)-n\) 为奇数,则先手胜,反之则后手胜。进一步拓展,当 \((\sum a_i)-n\) 为奇数时先手都是必胜的(我没想到哈哈哈哈)。因为我们只关心和的奇偶性,因此也只关心除的 \(\gcd\) 的奇偶性。因为先手可以一步使偶数变为奇数,那么任意时刻状态下 \(\gcd\) 都可以保持为奇数,则先手是必胜。考虑 \((\sum a_i)-n\) 为偶数,如果奇数(指 \(>1\) 的)个数 \(>1\),那么是必败。否则我们先手一定会操作那个唯一的奇数。直接暴力跑一下判一下就好了。复杂度 \(\mathcal O(n\log n)\)。
不知道为什么没想到,明明几乎全都都考虑到了的😭😭😭
嘉然今天吃什么
Solution
tmd,我们不难看出答案即是:
然后我就不会捏😅😅😅
我们可以继续推导:
然后我们可以使用上指标范德蒙德卷积:
然后就可以直接 \(\mathcal O(n)\) 了。
[AGC012C] Tautonym Puzzle
Solution
哈哈哈哈哈哈哈哈,什么都做不来了😏😏😏
我们考虑这样一种构造: \(1,2,...,k,1,2,...,k,k+1,k+1\),可以发现这样会有 \(2^k\) 的贡献。再考虑在 \(p\) 处后面以及最后填入 \(k+2\),那么就会额外产生 \(2^p\) 的贡献。然后从后往前扫一边就可以了。
感觉说着很简单,自己一做就什么都做不来了🐒🐒🐒
[AGC012E] Camel and Oases
Solution
哈哈哈哈哈哈哈,被波沙了🤣🤣🤣
我们考虑到其实相当于对于每个 \(i\),能通过 \(\lfloor\dfrac{V}{2^i}\rfloor\) 到达的为一个连续段,然后相当于你要从 \([1,\log_2(V)+1]\) 中的每个 \(i\) 选一个连续段,使得它与 \(0\) 中你钦定的段的并为 \([1,n]\) 。一个事实是当 \(0\) 中连续段 \(>\log_2(V)\) 时一定无解。
然后我们就可以状压 dp 了,设 \(f_s,g_s\) 分别表示已经确定集合 \(s\) 所取的连续段能到达的最右边以及最左边,然后直接跑一下就好了。
复杂度 \(\mathcal O(n\log V)\)。感觉还是思考的时候不够专注。😫😫😫
[AGC013C] Ants on a Circle
Solution
很强的题目,做不出来罪不在我😏😏😏
我们首先可以看出碰撞实际上相当于交换两个球的编号,这就可以得到最后球的位置。另外一个事实是因为这是碰撞,所以我们球的相对顺序是没有改变的,只需要计算出一个球的答案最后就都可以确定。
我们发现我们可以去统计蚂蚁穿过 \(0\) 的次数。因为如果蚂蚁从逆时针穿过 \(0\),那么对于最后的第一个蚂蚁来说相当于从最前面减少一个移到最后面,从顺时针穿过 \(0\),对于第一个蚂蚁来说相当于从最后面减少一个移到最开头,这样我们就可以算出第一个蚂蚁对应的位置了。
复杂度 \(\mathcal O(n\log n)\),瓶颈在于排序。
[AGC013F] Two Faced Cards
Solution
tmd鼻炎犯了,现在好难受🤧
首先值域可以离散化做到 \(\mathcal O(n)\)。我们考虑如果确定了怎么选,那么判断就是两个序列排序之后一一比大小。然而显然这个做法是没有优化方向的。考虑一种转化,对于双面牌你选了 \(x\) 相当于 \([x,\infty)+1\),对于序列里的 \(y\) 相当于 \([y,\infty)-1\) 。那么你就只需要每个位置都 \(\le 0\)。考虑加入选择的条件,那么我们可以都选优先选 \(a_i\),然后再考虑改变最少的 \(a_i\to b_i\)。那么题目可以被转化为,每个位置有个初始值,从若干个区间 \([b_i,a_i)\) 选择一些 \(+1\),使得每个位置 \(\le 0\)。
对于该问题,我们可以考虑贪心,即从后往前扫,每次遇到 \(<0\) 的,我们就不断选择右端点 $\le $ 它的一个左端点最小的区间。正确性比较显然。然后我们就可以做到 \(\mathcal O(qn\log n)\)。
考虑怎么快速查询。可以发现我们枚举选 \(a\) 还是 \(b\),那么相当于给一个后缀 \(+1\) 求答案。那么我们一开始预处理时先使得每个位置 \(\le -1\),然后我们即处理再处理出一个前缀的答案。这个同样可以使用贪心,即对于右端点,找到区间右端点 \(\le\) 它的左端点最小的区间,然后就变成了一个子问题,就可以直接 dp 求解了。
复杂度 \(\mathcal O(n\log n)\)。感觉跟值大小有关的匹配问题还是放在值域上面考虑比较容易做出来。😥
[AGC019F] Yes or No
Solution
组合意义天地灭,代数推导私权假🤮🤮🤮 被恶心坏了🤪🤪🤪
我们注意到一个事情,我们相当于在网格图上面行走,每次我们自己选一定选较大的一维,有一定概率是对的。然后答案至少是 \(\max (n,m)\)。事实上,如果我们的路线始终没有碰到 \(y=x\),那么答案的确就是 \(\max (n,m)\)。可以看出,区别就在于 \(y=x\) 上面。可以发现的是,每次走到 \(y=x\) 上面会额外增加 \(\dfrac{1}{2}\) 的贡献。这是因为假设一开始答案是确定的,而我们只是猜,那么如果不碰到 \(y=x\) ,我们猜的序列一定都是 \(\text{YES}\),这样每个询问是否正确也是确定的。而当我们碰到 \(y=x\) 的时候,我们就是等概率猜 \(\text{YES}/\text{NO}\),原先错误的我们就有 \(\dfrac{1}{2}\) 的概率猜对。但是我们似乎也会把正确的猜错,是不是会损失 \(\dfrac{1}{2}\) 的期望捏?然而并不是,因为 \(y=x\) 之后问题是对称的,所以我们可以将下方的路线关于 \(y=x\) 进行翻折。
所以答案就是:
然后就可以 \(\mathcal O(n)\) 计算了。其实如果往碰到 \(y=x\) 这个方向考虑应该还是可以找到规律的😋😋😋
[AGC019E] Shuffle and Swap
Solution
可以做的,但是摆了😏😏😏
我们发现如果我们确定 \(a_{1,2,...,k}\) 和 \(b_{1,2,...,k}\) 的匹配方案,那么我们将 \(a_i\) 连边到 \(b_i\),可以发现只有链上面的顺序是固定的,其他的操作都是可以任意排列的。考虑到链的头是入度为 \(0\),尾是出度为 \(0\),那么头就是 \(a_x=1,b_x=0\) 的点 \(x\),尾就是 \(b_x=1,a_x=0\) 的点,而链的中间部分就是 \(a_x=b_x=1\) 的点,不妨设为头和尾的各有 \(p\) 个,链中间有 \(q\) 个。
我们考虑用 dp 去构造链的过程,那么我们可以设1 \(f_{i,j}\) 表示已经确定了 \(i\) 个链的链头和链尾,有 \(j\) 个链中间的点,可以得到转移式:
前面就是从头里面选一个,从尾里面选一个,后面就是从链中间选一个,加入前面一条链的尾的前面一个位置。
最后答案可以枚举有多少个在链中间,答案即是:
当然,也有用 EGF 做到 \(\mathcal O(n\log n)\) 的方法,差不多的分析,这里就不赘述。
[ARC102F] Revenge of BBuBBBlesort!
Solution
md,之前做出来过类似的题结果现在没做出来😋😋😋
我们不妨列出一些必要条件:
-
鉴于每次操作会减少 \(3\) 个逆序对,所以总的逆序对 \(\equiv 0{\pmod 3}\)。
-
奇数位为奇数,偶数位为偶数。
-
因为一次要么奇数位的逆序对减 \(1\),要么偶数位的逆序对减 \(1\),所以奇数位的逆序对和偶数位为总的 \(\dfrac{1}{3}\)。
然后发现判一下就可以过了。不想证明了,摆了🤪🤪🤪感觉AT好多题都是用必要条件去判充分。😶😶😶
[ARC099F] Eating Symbols Hard
Solution
nc了,直接hash即可判断。😥😥😥
[ARC098F] Donation
Solution
这种jb题为什么luogu上是紫题啊😅😅😅
我们考虑将捐钱过程反过来,变成拿钱,那么相当于每次我们到点 \(u\) 需要至少 \(c_u=\max(a_u-b_u,0)\) 的钱,然后就可以拿到 \(b_u\) 的钱,最小化我们最后能拿到的钱,其实也即是最小化我们初始所拥有的钱。可以发现的是对于一个节点我们一定会在第一次经过它的时候就拿钱。然后我们考虑建出一个类似于 kruskal 重构树的东西,使得建出来的数满足一个点在只经过 \(c_v\le c_u\) 的点 \(v\) 所能到的点在它的子树内。
然后我们的贪心过程,可以发现当我们经过一个点 \(u\) 的时候,我们完全可以把它子树内所有节点都处理掉,那么我们的贪心方法一定是从一个子树内选一个节点爬上来,然后处理别的子树。可以发现这个过程可以 dp,设 \(s_u\) 为子树内的 \(\sum b\),\(f_u\) 表示 \(u\) 这个子树从 \(u\) 的某个子树节点开始,最后到 \(u\) 的最小初始拥有钱数,那么可以得到转移式:
如果为叶子的话 \(f_u=c_u\) ,最后答案即为 \(f_{rt}+s_{rt}\)。
然后就可以做到 \(\mathcal O(n)\) 了。
CF1034E Little C Loves 3 III
Solution
🤮🤮🤮 难 死 我 了 😣😣😣
我们设 \(f(x)\) 表示 \(x\) 二进制下 \(1\) 的个数,然后把 \(a_x\to a_x\times 4^{f(x)},b_x\to b_x\times 4^{f(x)}\),设这两个的 fwt 卷积结果为 \(c\),那么 \(x\) 位的答案就是 \(\dfrac{c_x}{4^{f(x)}}\mod 4\)。
其实证明也很简单,因为当 \(x\wedge y\not=0\) 的时候 \(4^{f(x)+f(y)-f(x|y)}\equiv 0\pmod 4\),就不会产生贡献了。复杂度即为 \(\mathcal O(n2^n)\) 。
不要用scanf("%1d")!!!
CF1336E1 Chiori and Doll Picking (easy version)
Solution
我要完蛋了,一天自己没有做出来一道题🤤🤤🤤
有一个结论是如果有 \(n\) 个数,线性基中有 \(c\) 个,那么有 \(2^c\) 个数,每个出现 \(2^{n-c}\) 次。那么我们这个题目相当于统计 \(2^c\) 个数中每种 pop_count 的出现次数。可以发现这个可以折半搜索,因为前面一半的线性基中元素异或出来一定是 \(<2^{m/2}\) 的,然后直接 fwt 即可。
复杂度 \(\mathcal O(2^{m/2}(m/2)^2)\) 。
「Gym 102798E」So Many Possibilities...
Description
有 \(n\) 个怪物,每个有 \(a_i\),有 \(m\) 次操作,每次从当前存活的怪物中均匀随机地选一个血量 \(-1\),当血量为 \(0\) 的时候怪物会死掉。问最后死掉的怪物期望数量。
\(n\le 15,m\le 100\)
Solution
又做不出来😅😅😅 我们发现我们的问题在于我们如果删除一个点之后之后选到每个点的概率是会变的,我们其实考虑我们先确定哪些位置会彻底删掉一个怪物。那么我们考虑设 \(f_{i,S}\) 表示当前考虑到第 \(i\) 次操作,死掉的怪物集合为 \(S\) 的概率,可以得到转移式:
然后我们就会剩下一些位置去放哪些保证不会被杀掉的怪物,我们不妨设 \(g_{i,S}\) 表示把集合 \(S\) 里面的怪物一个不死地放进 \(i\) 次操作中,可以得到转移式:
最后的答案即是:
复杂度 \(\mathcal O(nm2^n)\) 。
[ARC096F] Sweet Alchemy
Solution
哈哈哈哈哈哈哈,没有一步想到了🤣🤣🤣
我们可以考虑先差分,那么就相当于每个点可以选 \(\le D\) 次,每次贡献为子树大小,代价为子树 \(m\) 和。(\(1\) 节点可以选无数次)注意到范围太大了,肯定是没有办法直接背包的。而注意到我们每个物品的贡献都是 \(\le n\) 的。我们考虑一个贪心,即按贡献/代价从小到大选,那么我们可以考虑到假设 \(u,v\) 贡献代价分别为 \(w_u,c_u,w_v,c_v\) 且 \(\dfrac{w_u}{c_u}>\dfrac{w_v}{c_v}\),那么当我们 \(v\) 选了 \(w_u\) 个的时候我们肯定会换成 \(w_v\) 个 \(u\),因为这时两者的贡献相同,而 \(u\) 的代价更小。所以如果 \(u\) 已经选的次数 \(<D-w_v\),那么 \(v\) 至多只能选 \(w_u-1\) 个。
那么这个时候我们的做法就很明显了,我们可以每个 \(u\) 选 \(\min(n,D)\) 个放入多重背包里面,然后后面贪心选择。正确性可以感性认识一下😜😜😜大概是帮 \(u\) 确定了最后的 \(n\) 个,帮 \(v\) 确定了前面的 \(n\) 个,因为顺序没有关系。
复杂度可以用二进制分组或者单调队列做到 \(\mathcal O(n^4\log n)/\mathcal O(n^4)\) 。
[ARC093F] Dark Horse
Solution
tmd,爷tm想了一年没有想到最后的容斥😅😅😅
你发现实际上就是给 \([0,n)\) 每一个的 \(2^i\) 个位置中赛数使得 \(A\) 集合不是最小值。那么我们可以钦定至少存在某个集合它们的位置 \(A\) 是最小值,那么我们把 \(A\) 从后往前 dp,我们可以设 \(f_{i,S}\) 表示倒着考虑到了第 \(i\) 位,钦定了 \(S\) 这个集合,转移式即为:
最后的答案即为:
\(2^n\) 是确定 \(1\) 的位置。复杂度即为 \(\mathcal O(n2^n)\) 。我是sb。