日寄 of Febuary,2025
孩子们,我回来了
2.9#
回来第一天,教练换了种训练法,给一套题,然后早上尽全力做,下午自己改。
好好好相当于 6 天考 6 次
第一次,4h 一题没出。
T1
一开始以为是 DP,但是是搜索 + 大力优化。
具体就是写个记忆化,然后直接枚举每种状态。
T2
数位 DP,但是还以为是找规律。
过了一个寒假都忘完了
直接枚举倍数会 T 飞,所以考虑枚举数,然后判断。
记录 num
代表模 k 意义下的数,sum
代表二进制下 1 的个数。
如果 num
最后等于 0,则将 sum
计入答案。
然后套板子就是了。
T3
神奇 DP,实话说没怎么看懂
我们设 dpi,j 表示第 i 层,还剩 j 个木块的方案数。
则有 DP 方程如下:
let k=min(i,j)dpi,j=p=1∑k(i+1−p)×dpp,j−p这个是 O(n3) 的,会炸。
我们可以发现,这个可以把每个 dp 的值展开,实际上就是从 (1,2) 到 (i,j−i) 的所有 dp 的和,并且差值都是 dpi−1,j−dpi−2,j。
于是,我们就可以把答案优化为 dpi,j=2dpi−1,j+dpi−2,j+[j≥i]dpi,j−1。
这样就能 O(n2) 过了。
下午就把前三题和 T5 改了。
晚上懒得改 T4 了(不想手写 bitset),于是去写平衡树了。
2.10#
DP 综合训练
T1
记忆化搜索。
我们发现,如果存在 a>b<c 的木块,则中间的一定不能被合并,无解。因此,答案一定是一个单峰的形状。
而我们又发现,∑a≤213,所以我们可以考虑维护每一个状态。
但我们又发现,每一个木块有两种放法,总共是 226 种状态。但是,知道了一边的和,我们就可以知道剩下一边的和,只用维护 213 种状态就好了。
然后暴力记搜救好了。
记得首先判断 ∑a 是否是 2i。
T4
上午写了个暴力,跑了所有 n∈[1,40],k∈[1,n] 的情况,但是没看出规律。
翻译一下题面,就是把一个整数 n 分为恰好 k 个整数的和的方案数,就是 p(n,k)=[i≥j](p(i−j,j)+p(i−1,j−1)),p(0,0)=1,递归求解就好了。
但是,为什么不取模啊,还得开 int128
。
T5
很神奇的一道期望 DP。
首先,我们设 dpi,j 表示正常进度花了 i 秒,实际已经用了 j 秒的期望剩余时间.
因为是期望 DP,一般倒推,所以答案为 dp0,0。
然后我们考虑转移,我们在发生意外的情况下,可以考虑是否重开,否则必须重开。
因此有转移方程:
dpi,j=(1−pi)(dpi+1,j+ti+1−ti+ti+1−ti)+{pimin(dp0,0,dpi+1,j+di+ti+1−ti+di+ti+1−ti),j+di+n−ti<rpi×dp0,0,Otherwise然后神奇的就是,DP 方程里面有 dp0,0,我们要求的也是 dp0,0,然后因为存在 min 所以你不能暴力解方程。
所以,考虑二分,每次二分一个 dp0,0,然后和算出来的 dp0,0 比较,如果大了就计入答案并且调小一点,否则调大一点。
有一说一不取模的计数 DP 真的烦,关键还卡 Python。
晚上好像在水题。
2.11#
今天考试。
乍一看就不会做,打了个暴力骗了 30pts。
实际上是区间 DP,但是没改。
第一眼看到撤销,我还以为是可持久化,但是再一看是定点撤销,就不用想了。甚至可以撤销撤销操作
赛时我本来想的是维护括号序列的树形结构,然后撤销和恢复就直接改儿子数量就好了。
但是大样例过不去,问题是如果有几个已经撤销的点连在一起,要么复杂度假,要么直接假。
实际上是用线段树维护每一层的括号数量,但是太烦了,我写的矩乘线段树。
我们发现,对于 1 操作,ans→ans+cnt+1,cnt→cnt+1;对于 2 操作,ans→ans+1,cnt→1。
然后我们维护一个向量 [anscnt1],然后转移矩阵就出来了。
对于撤销操作,我们可以用线段树维护操作序列的 Trick,撤销的时候,把这个矩阵改成单位矩阵,恢复就改回来。
然后答案就是 (ans×tree1)1,1。
神奇构造题,不会也没改。
神奇图论题,不会也没改。
2.12#
打了一场 Div.2 VP,做了 ABD 三道。
A
我们发现,如果 n 的后面有 k 个 9 的话,那 S(n+1)=S(n)−9k+1。
因此,我们就可以直接判断 x−y+1mod9 是否等于 0,同时注意,k≥0,要判断 9x−y+1≥0。
B
神奇策略。
我们设 ci 为 i 在 a 中出现的次数,则我们直接遍历整个值域,如果 ci≥2,ci+1→ci+1+ci−2,ci→2,如果遇到 ci=1,则无解。
D
交互题。
首先,题目中说了,∀i,j,(xi,yi)=(xj,yj),意思是,B 对象不可能出现 0,而 A 对象只有在没有路径的时候才能出现 0。
所以,如果有 p∈/x,就可以查询 p 和其他任意一个点,如果是 0 就是 A 对象,否则为 B。
那如果一个不缺呢?我们发现对于 B 对象,dist(a,b)=dist(b,a)。所以,我们可以分别查询 (a,b),(b,a)。
但是 A 对象也可以通过给你一个环来卡你,所以,我们选择的 a,b 就有要求。
因为前面缺失数的情况已经被判断掉了,所以我们可以直接选择满足 xa=minx,xb=maxx 的 a,b,然后判断返回值是否大于等于 n−1。
因为就算 A 对象出环卡你,它的距离也一定不会大于 2n,而前面选择最大最小值,就可以保证距离最小为 n−1。
所以,我们的策略就如下:
- 首先判断 x 是否为 [1,n] 的错排,如果不是,就可以查询不在 x 中的一个点,若返回值为 0 则为 A,否则为 B。
- 如果不是错排,则选取最大最小值的点,判断返回值是否相当并且大于 n−1,如果是,则为 B,否则为 A。
然后下午接着补 CF 的题,顺便学习了主席树维护区间 MEX 的操作。
因为李超树的专题里面有两道点分治 + 李超树的题,于是就在学点分治。
我觉得点分治只有求重心是一样的。
2.13#
今天终于拉专题了。
本来是在做 C 题,点分治 + 李超树,但是写挂了,写了一个上午,然后就没重构。
下午不想写,于是去学了学 KTT,然后花了半个下午搞定了板子题,之后就去跟 P5073 斗志斗勇了。
我们可以通过将操作离线,然后对全局加的数求前缀和来消去 KTT 不能操作负数的问题,但是第一次可能是负数,所以可以暴力加,加完再建树。
然后就是 KTT 维护最大子段和的模板题,但是 lxl 的毒瘤数据以 0.01s 卡掉了我。交了大概一页,突然发现可以将快排换成归并,会更快,然后就过了。
晚上教练让我们验初赛题,直接请 DeepSeek 上来 awa。
2.14#
考试。
结论题,然后赛时没想出来。就是对每一行的最小值取最大值。
DS 题,主要是求区间前驱后继,但是卡平衡树,我的主席树还写挂了。
DP,不会。
缩点 + DP,不会。
2.17#
今天拉专题。
这几天可以能都要写树分治吧。
早上去参加开学典礼,
CF263E
为什么不给翻译啊
读完题就发现,这个就是 P4178 变到二维上,并且第二维的值域不许你开树状数组。
我们可以将 P4178 的平衡树换成树状数组套平衡树,然后一交,发现 T 了,看来是卡了常数巨大的 O(nlog3n)。
但是我们可以考虑剪枝,我们可以记录之前插入的最大范围,查询的时候,我们在这个范围里面查就好了。
我们再记录该子树内的最大深度,在插入的时候,我们只插入到 dep 就好了。
Luogu P4149
Luogu P6329
点分树模板,但是调了一上午,可能和今天早上不舒服有关。
点分树就是把点分治每一层的分治中心拿出来建一棵重构树,因此,树高就是点分治的层数,即 O(logn)。
然后,我们发现,这棵重构树和原树一般没什么关系,但是有一点可以确定,重构树上的 LCA 一定在原树 x→y 的路径上。
结合前面写的树高为 O(logn),我们可以考虑暴力跳父亲,跳到根为止来枚举路径。
但是,我们可能会统计到在同一子树内的答案,于是我们还需要去重。
我们可以记录 sum1(x,k) 表示在重构树上与 x 的距离 ≤k 的点权和,sum2(x,k) 表示重构树上 x 的父亲的子树中与其距离 ≤k 的点权和。
则答案为 ∑sum1(fax,k−dis)−sum2(x,k−dis)。
修改就一路向上跳单点修改就好,因此我们可以直接用树状数组维护。
2.18#
考试,因为是老 NOIP 所以只有三道题,35pts。
码农模拟,不改了。
根号分治,设定一个阈值 B,用正常套路,小于 B 的暴力修改,大于 B 的可以通过预处理来解决。
首先,对于每一个 k,合法集合的方案是唯一的。
然后,设 fn,k 表示 n 个人中 k 个赢的概率。
考虑转移,我们新加一个人,即 fn,k→fn+1,k。
我们考虑在两个方向加入这个人,如果在前面,那么输则要使原来的赢家接着赢,概率为 (1−p)k,赢则要赢过所有大于它的,概率为 pn−k+1。
所以,可以得到 fn+1,k=fn,k×(1−p)k+fn,k−1×pn−k+1。
同理,考虑放在后面可以得到 fn+1,k=fn,k×pk+fn,k−1×(1−p)n−k+1。
联立方程:
fn,k×(1−p)k+fn,k−1×pn−k+1=fn,k×pk+fn,k−1×(1−p)n−k+1fn,k×((1−p)k−pk)=fn,k−1×((1−p)n−k+1−pn−k+1)即 fn,k=fn,k−1×((1−p)n−k+1−pn−k+1)×((1−p)k−pk)−1,初始情况是 fn,0=0。
这样,在 p=1−p,即 p=21 时就能 O(n) 算出答案了。
然后我们考虑 p=21 的情况,则输和嬴的概率都是 21,我们在 n 个人中选 k 个就好了,fn,k=2k(n−k)Cnk。
晚上打了一场 CF Edu。
签到题,如果有 bi∼i+2=[1,0,1] 则无解。
那我为什么还 +2
签到题,注意到每一种颜色对答案的贡献要么为 1 要么为 2,当有相邻的同色块时为 2,统计所有贡献并减去最大的就好了。
这种题挂一发
写了题解,直接拿过来算了。
CF2069C
由美丽数列的定义得,一个美丽数列一定是形如 [1,2,2,…,2,3] 的。由此启发我们来枚举每一对可以匹配的 1,3。
然后我们发现,子序列也是可以算作美丽数列的,设一共有 k 个 2,则美丽数列的数量为 ∑i=1kCki=2k−1。
运用前缀和的思想,我们记 sumi=∑j=1i[aj=2],则我们可以枚举每一对 1 和 3,然后计算答案。
上面这个算法是 O(n2),无法通过此题,考虑优化。
我们发现,每一个 3 会和前面所有 1 匹配,记 cnti=∑j=1i[aj=1],若 1 的位置为 p,3 的位置为 pos,则贡献为 2sumpos−sump1+…+2sumpos−sumpcntpos−cntpos。
我们可以把每一项的 2sumpos 提出来,后面就是 ∑i=1cntpos2−sumpi=∑i=1cntpos(2sumpi)−1,然后再用前缀和,记 invsumi 表示 ∑j=1i(2sumj)−1×[aj=1],则我们只需要枚举所有的 ai=3,然后将 2sumi×invsumi−cnti 计入答案即可。
时间复杂度为 O(n)。
然后看着别人六行的核心代码陷入了沉思
2.19#
打完 CF 能起晚一点就是爽。
早上过来,先把 C 题的人类智慧写成了题解,然后就去改了下 D,其实还是比较简单的贪心,如果 A,C 都不卡壳我应该能过。
因为有 Open Hacking 所以没出 Rating 变化,这肯定不能掉分了吧。
然后就把 CF 1303G 过了,过来才发现是路径长度维护反了。
过了一道点分治的题,昨天脑子抽了,不知道用什么 DS 维护,都在想 KDT 了,然后今天用线段树就过了。
2.20#
CF 分算完了,重新上绿了,爽了。
只要下次不掉回灰就好。
今天考试,黄题二分没想出来,只有 60pts。
利用了期望的线性性,答案为 1+∑i=2nPi,Pi 表示第 i 堆在第 1 堆前被取走的概率。
考虑求 Pi,发现只和 1,i 两堆有关,则 Pi=a1+aiai。
然后就没有然后了。
如果不改变值,则就是 P1182,二分最大值就行。但是它有啊
我们发现,如果随机枚举 x,则 Ansx<Ans 的期望是 ∑i1≈lnx。
则我们可以随机生成一个 x 的序列,然后每次遇到一个 x 就用 Ans−1 check
一下,如果非法,则继续下一个,否则就二分答案。
时间复杂度好神奇,O(nm+lnn(nlogn))。
数论 + 容斥题,还要用 Miller-Rabin。
省流: T1 太简单气活了,T2 太神经气笑了,T3 太难气死了。
2.21#
补题。
本来说今天去讲题的,但是 G 题树套树送走了所有人,H 题又根本没人听。
然后就是把线段树优化建图学会了,同时用人类智慧方法过了 I 题(线段树优化建图 + 树剖 + Tarjan SCC)。
2.22#
考试。
我们发现,我们可以把最高点找出来,然后在旁边加数,贪心的往贡献小的地方加,同时用树状数组统计逆序对就行了。
首先,我们设 fi,j 表示考虑完了前 i 条线段,最后在 j 的最小花费。
首先,f0,j=∣j−x∣,然后我们转移。
对于 fi,j,首先先加入线段 i 的贡献,fi,j={li−j,j<li0,li≤j≤rij−ri,j>ri,然后我们用 fi,j+1 去更新 fi,j−1,fi,j+1。
我们如果把 fi,j 看作关于 j 的函数,则我们发现它的导函数分为 −1,0,1 三段,则 fi,j′=0 的答案最优。
没改。
忘了/
2.24#
今天打 USACO。
其实昨天晚上就开了银组,然后没 AK,于是我重新注册了个号,上午在打铜组。
T1 是个简单模拟,T2 对权值数组做一个前缀和就做完了,T3 是个区间 DP。
然后下午也没有开银组,去补 Jan 的 USACO 了。
2.25#
考试。
原题是求 ∑i=1n∑j=1pφ(ij)(mod109+7)。
我们可以直接枚举 i,j 来打表,发现 ∑j=1pφ(ij)=φ(i)(1+i+i2+…+ip−1)=φ(i)(ip−1)(i−1)−1
则 Ans=∑i=1nφ(i)(ip−1)(i−1)−1
但是这个 n 达到了 107,必须线性求 φ,ip,i−1,但是这三个都可以用线性筛筛出来,因为 i−1≡im−2(modm=109+7)。
所以总复杂度是 O(nlognp) 的。
发现,从大到小,每加入一个无限制的数,空位会多一个,加入一个叶子节点,空位会少一个,把每次操作前的空位数量求积就行。
不会的 DP。
神奇博弈论。首先,我们可以求出数列中所有数的异或和,记为 S,游戏是平局当且仅当 S=0。
否则,我们可以找到 S 的最高位,然后 ai←aiand2p。这样,a 就是一个仅包含 0,1,且一定包含奇数个 1 的数列了。胜的条件就变为取到奇数个 1。
然后分类讨论,若 n 是偶数,那么先手一定能拿到奇数个 1,先手必胜。
否则,如果先手取了两边的一个 0,则局面就变成了 n 为偶数,奇数个 1,先手必败。因此,先手一定会取 1,我们可以先把两边相同的删去,然后,如果相邻的两位相同,那才先手必胜,否则先手必败,同时,需要满足剩下的 1 的个数是 4 的倍数。
2.26#
今天做题。
大力补 USACO 2025 Jan 的题。
全部写下面得了。
做题记录
我们转换一下题意,就是找到一个 x,使得满足 ai≡x(modM) 所需要的操作次数最小。
于是,这个东西就可以转化为求一个点,使得它到其他所有点的距离和最小。这个有个结论,就是取中位数。
然后注意,这个是在模意义下的,所以可以加到 x,也可以减到 x,所以需要复制一遍,并且全部加上 M,然后统计贡献。
什么出题人求 npy Ad-hoc 题。
我们发现,数量为一的数只有 2,2n 两个,并且 2 对应了一些不重复的数,2n 也对应了一些不重复的数(推不出来可以打表)。
于是,我们就可以通过这个来推出对应关系,然后取字典序小的那个就好了。
这个一看就不知道该怎么做,直接考虑 DP。
设 dpi,0/1/2 表示 i 的值小于/等于/大于中位数,w0/1/2 表示把小于/等于/大于中位数的变成 m 的花费。
则有 DP 方程 dpu,x=minmed(i,j,k)=x{dpls,i+dprs,j+wk},如果没有儿子,那就是 dpi=w。
考虑带修的情况,因为完全二叉树的树高为 logn,所以可以暴力修改,然后 dp1,1 就是答案。
好耶,是 DS
因为 1 操作不改变连通性,所以我们可以将 t 视为假装删除,即不统计其贡献,否则直接删除。
由于不好维护删除,所以我们考虑反向操作,改成加入点,这样就可以方便的用并查集维护。加入点的时候更新集合的大小与答案,合并集合的时候也更新答案。
今天终于开可持久化了,光速刷榜交了过了的题。
然后学了可持久化 01Trie,顺手写 Blog。
2.27#
考试。
想不到怎么做,考虑 DP。
设 dpi,j,k 表示考虑前 i 个,{i−1,i,i+1} 有 j 个,{i,i+1,i+2} 有 k 个,且 [1,i] 全部用完的方案数。
考虑转移,我们发现 dpi,j,k 可以转移到 dpi+1,k,cnti+1−j−k−3x,然后就做完了。
但是这道题卡空间,所以 dp 要动态开。
原题,ARC144C
不会,笛卡尔树 + 奇奇怪怪的算贡献。
不会,奇奇怪怪的 DP。
今晚打 CF,但是没回家,得在机房待到十二点。
发现在模 15 意义下,0,1,2 都会产生贡献,算出来就好了。
我们统计一下前缀和,如果存在 −x,则答案加一,然后找循环节,也就是前缀和为 0 的地方,找到后就能算出次数了。
最大值最小,一眼二分。
我们枚举 x,若 ai<x 并且 si=R,则必须满足,如果大于 x 并且为蓝色,则也必须满足,最后统计段数然后判断是否 ≤k 就行了。
盯真题。
我们设 fi 表示到达 i 的方案数,sum 表示当前层的 ∑f,则下一层每一个点 p 的贡献为 sum−ffap,最后求和就好了。
2.28#
睡到 8 点才去机房吃泡面。
先把 Edu 的 C,D 补了,然后就做可持久化专题去了。
因为 jmr 的题可能要用线性基,就去学了学。
还有为什么可持久化专题会有纯图论题啊。