10.5 ~ 10.11 每周总结
做不动专题了,该补一下上周的总结了。
10.5 周一
休息了。
P17615 [Math+Girl×1] Passionfruit Pantheon / Modular Inverse
完全没做任何证明,纯打表。
直接自己写一个 exgcd,然后暴力看看哪些不满足。
打出来的表大概是 \(4, 6, 9, 10, 21, 25, 49, 55, 121, 169\)。
很有规律啊,首先发现所有的 \(p^2\) 都在这里,然后是剩下的那些数,分别是 \(2\times 3, 2\times 5, 3\times 7, 5\times 11\),发现了吗,首先都是质数相乘,然后就是都为 \(p(2p+1)\) 的形式。
再然后由于 \(p^2\) 所以量级是 \(\sqrt M\) 的,直接筛出来就行。
10.6 周二
神秘小比赛。
T1 对列
难度:水+。
首先发现最值取在交点附近,于是按这个交点切开,变成四个区间。
然后我们沿着这个交点的纵坐标一切,发现值域不交。
于是直接数组劈成两半,前一半找两堆当做下面的,后一半找两堆当做上面的就行,让数连续肯定不劣,于是枚举一下前半个分开在哪里,交叉匹配计算一下就行。
T2 旧牌
难度:水++。
设 \(dp_i\) 表示以 \(i\) 选了为结尾的方案数。
一个区间能被表示出来则 \(a_{i - 1}\) 可以被表示,那么 \(a_{i - 1} - a_{i}\) 一定存在,但是如果我们没有选择 \(a_{i - 1} - a_{i}\) 就要选 \(a_{i - 1} - 2a_{i}\)。
所以我们可能的转移就是这些位置,但是我们要满足这些相邻的点出现后,相邻的点可以把它们间的区间填满,只有都能填满这个转移才是合法的。
显然合法转移对于一个数来说到某个位置就变得不合法了,然后直接暴力做,成功通过。
不过我们还是看看更文雅的方式吧。
不妨设 \(p_i\) 为 \(i\) 最远的合法转移点。
那么在 \(p_i\) 到 \(i\) 之间的转移点都会比 \(a_i\) 大,而所有数的转移点都是单调的,那么说明只有 \(p_i\) 可能作为下一个转移点。
而假如 \(p_{j - 1}\) 并不是 \(j\) 的转移点,那么再远的转移点就不会满足到 \(j - 1\) 能被填出来了。
所以这说明 \(p_i\) 可以沿着 \(p_{i - 1}\) 一路沿着 \(p\) 走就行,可以用栈维护。
所以说明了上面的暴力是对的。
T3 自记
难度:水++。
首先发现我们从前往后填数,填到某一位时会使得整个序列已经确定,通过某些手段应该是能证明这样填出来一定是合法的。
所以我们设 \(dp_{i, j}\) 表示到 \(i\) 填了 \(j\) 的最小代价。
后面会有 \(n-j\) 个数被确定了,我们限制一下每个位置不能填太小就行。
转移还需要计算一下区间变成某个数的代价,设 \(p_{i, j}\) 表示 \(i\) 前缀变成 \(j\) 的代价。
第 \(i\) 个数会让后面填上 \(i - 1\),于是转移是:
for (int j = i - 1; j <= n; j++)
for (int k = i - 1; k <= j; k++)
dp[i][k] = min(dp[i][k], dp[i - 1][j] + (k != a[i]) + (pre[j][i - 1] - pre[k][i - 1]));
直接对 \(dp[i - 1][j] + pre[j][i - 1]\) 维护后缀 \(\min\) 就行。
记得滚动数组。
T4 环上寻低
难度:岩浆+。
可惜没时间了,没做完就逃跑了。
我以为一车人 40 pts 是大家都发现关键结构了,结果是输出 0 的分。
首先我们来思考一下如果一个数是最大值,那么其有且仅有两条边。
删掉这个点后,度数为 2 的点同样可能是最大值。
直接这么做一个状压,尽管压根没判无解,但是还是能获得 40...
首先这个最大值一定会连向相邻的数,删了这个最大值之后 2 度点会连向删后相邻的点,所以如果 \((i, i + 1)\) 不存在,一定无解。
然后我们画一下合法的图,发现是 \(n\) 个点的多边形的三角剖分。
于是直接将三角看做一个节点,相邻就连边,最后会连出来一颗无根树。
现在我们要求这棵树的拓扑序,我们发现每个方案都存在一个三角,其三个点是最后连续缩起来的,直接将这个钦定为根,一棵有根树的拓扑序方案是好求的,直接换根 DP 即可。
可恶的 OJ 竟然只有 8MB 的内存!
10.7 周三
好像并没有干什么。
10.8 周四
好像并没有干什么。
10.9 周五
三水一粪模拟赛。
轮廓线DP:难度约为 CSP‑S 第三题⾄第四题。
T1 ANDORXOR(past)
难度:微粒-。
难以置信的题目。
牛魔的忘了给 \(a, b\) 排序直接掉了 40。
T2 Cataclysm Cry(ghost)
难度:微粒。
这样的幽魂形态在哪里领?
直接简单维护一下前缀和以及开了幽魂形态的前缀和,直接将开了的区间替换为另一个前缀和算一下就好。
T3 Oblivion(shugenja)
难度:岩浆。
合法区间是前半个没有 \(R\) 后半个没有 \(L\) 的区间,依旧设 \(dp_i\) 表示以 \(i\) 为内鬼结尾的方案数。
首先如果前面出现了一个 \(L\),那么假设前面是 \(R?????L?????R?????\),那么在 \(L\) 前面的 \(R\) 的前面不能再进行转移了,并且区间的中点要落在 \(L\) 到 \(R\) 之间,直接解一下不等式 \(\lfloor\frac{i+j}{2}\rfloor\in [l, r]\) 就行。
如果前面没有出现过 \(L\) 咋办?
那么假设前面是 \(R????RR???RRR????RR\),那么中点和左端点会落在同一个 \(?\) 块内,对 \(i\) 找有点困难了,所以改成 \(j\) 对哪些区间产生贡献就行。
并不好写。
难度基本给在调了好半天。
T4 No way back(chess)
难度:???/岩浆?
其实如果会插头 DP,可能这个题不会太困难?
不过不用插头 DP 写了一版 94 分的。
回收开头。
首先我们感觉上是需要状压的,设计颜色有 \(5\) 种,分别是白子现在有没有活,黑子现在有没有活和空格。
这样直接转移是错的,因为可能会有两个联通的但不相邻的互相产生影响。
但是能获得 80 pts!
于是我们额外压入连通块数组,用每位 \(3\) 个 bit 压入状态。
顺便记录每个连通块是什么颜色的。
这样疯狂的转移,疯狂的调试就能获得 94 pts!
轮廓线 DP 暂时鸽了,只学了没写()
10.10 周六
代码源的 Div.2 确实简单。
T1 今汐的巡防分区
难度:水+。
思考一下由于 \(n, m\) 不同阶,问题需要枚举 \(n\) 来做,考虑不经过一个矩形怎么走,一定是经过了这个矩形的右下角向下引一条线,或左上角向上引一条线。
直接枚举这些点然后统计,但是这样会算重,因为在下面的一个点可能会经过到上面的点,所以钦定右下方的点到达这个点时的最后一步一定是向右的,左上角同理。
T2 卡提希娅的接线方案
难度:水+。
我去了,不判 \(S=T\) 直接 \(100\to 15\)。
发现可以两步实现交换两条边,一步实现删除一条边,然后经过激烈的证明可以得知,我们需要先删 \(S\to T\) 这条路径上的边,然后再进行交换操作。
交换边肯定是把一个更优的边丢上来,需要进行该边到路径上距离的操作次数。
于是先删,删完了记录 \(d_i\) 表示删 \(i\) 次可以获得的最大边即可。
T3 爱弥斯的观测记录
难度:岩浆。
感觉很有启发感。
就是首先这个问题还是设 \(dp_i\) 表示以 \(i\) 选为结尾的最优方案。
然后发现获得一个 \(O(n^2)\) 状物,怎么优化呢?
想了很多做法都优化不了,怎么办呢?
还是分块之类的吧。
首先想到了能否折半搜,发现并不能,但是我们可以沿用折半搜的思想,将数拆成前一半和后一半,然后合并两者的贡献。
这下思路明晰了,假设 \(a_i\) 按位折半分别为 \(x_i, y_i\),于是我们设 \(dp_{i, j, k}\) 以 \(y_w=i\) 为结尾的 \(x_w\) 与 \(j\) 异或的 \(\operatorname{popcount}\) 为 \(k\) 的答案,再设 \(f_i\) 表示以 \(i\) 结尾的答案。
那么就有:
这样就是 \(O(n\sqrt{V}\log V)\) 的了。
T4 达妮娅的脉冲测试
难度:岩浆+。
难度给在赛时没调完。
首先我们需要一双发现美的眼睛。
个场景的初始节点两两不重合,且每行、每列至多各有两个初始节点;同一次询问的新增节点两两不重合。
发现了吗,这是重要的性质,这保证了一个点只会有两个出边。
然后我们画一下可能的连边情况,可以证明,只会出现环和链。
那么现在要加入 \(k\) 个点怎么办?
这些点想要让环/链上的点被更新到,一定会通过与其某维坐标相等的点去更新,这个点数是 \(O(k)\) 的,首先先暴力处理出来。
然后我们发现这些点之间还可以通过环/链上的点走到下一个 \(k\) 个点之一在走下去,所以直接将相邻两个点连上其在环上的其中一条路径距离或链上的路径距离。
那剩下的点该怎么更新呢?
首先先不考虑环,那么提取出链上相邻两个点,则中间的点一定被这两个点更新。
直接枚举一个划分点,这左边都归左边那个点更新,右边反之,可以发现越往左边走左边的时间越大,右边的时间越小,故而最小值取在两个交点附近。
直接上一个二分就行。
环怎么办呢?
直接看成链,然后把端点必定加入,再给端点连上多出来的边就行了。
链也这么做的话连边界都不用特意判了。
有点不太好写。
P17548 [JAG 2026 Summer Camp #2] Longest Path on DAG
难度:岩浆。
很有趣的题啊。
首先由于这是一个按节点标号的二分图 + DAG,考虑倒序枚举求答案。
如果现在是一个黑点的话,可以通过二分找到最大长度的有连边的白点。
可是如果是一个白点就直接摆烂了。
可是我们来想想,如果现在要求一个区间内的白点的转移呢?
可以从长度大到小枚举黑点,然后看看哪些白点有连边,有的全都删掉。
这样如果我们每次必定仅访问删除点是不是就是对的了,那直接上一个线段树不就好了。
既然我们能做到区间白点的转移,直接考虑 CDQ 分治。
左边的黑点直接用上面的二分求答案,左边的白点加入线段树。
然后枚举右边的黑点,找到所有连上的白点删除就行。
算了算加点小剪枝是不会超出限制的。
复杂度貌似是 \(O(n^2+n\log^2 n)\) 的。
10.11
神秘小题目。
一般难度的推式子题
难度:恒星-。
神神神。
放宽限制求高度 \(\leq k\) 的方案数。
直接考虑一棵树是可以转化成括号序列的。
然后深度限制就是前面没被匹配的括号数量不能超过 \(k\),那么将括号序列拍到网格上,就是一个经典的反射容斥了。
单次反射容斥是 \(\frac{n}{k}\) 的。
所以复杂度是 \(n\log n\)。
宝宝难度的推式子题
难度:岩浆。
这才是推式子题哦。
就是你现在考虑直接转移式子,假设 \(f_{i, j}\) 表示 \(i\) 个节点的树高度小于等于 \(j\) 的方案数。
转移就是做一个树上背包,然后将高度限制降低 \(1\)。
直接写多项式形式,假设 \(F_j\) 表示高度小于等于 \(j\) 的树的个数的 OGF。
那么有这个转移:
边界是 \(F_0=x\)。
然后我们需要提取 \([x^n]\)。
这个东西该怎么做呢?
先写出来几项的系数看看:
你看出规律了吗?
没看出来的话,我把系数单独写出来:
1
1 -1
1 -2
1 -3 1
1 -4 3
还看不出来?
我再多写几项,为了好看改成 \(16\) 进制了,再删掉这烦人的负号。
1
1 1
1 2
1 3 1
1 4 3
1 5 6 1
1 6 a 4
将头顺时针转 \(45\) 度或将屏幕逆时针转 \(45\) 度就能发现了。
斜着读出来就是组合数。
于是我们可以得到一个有趣的事情。
假设 \(Q_i=\sum_{j=0}^{i}{(-1)^i\binom{i-j+1}{j}}\),那么有:
是的,很富有美感,现在我们要提取 \(F_k\) 的 \([x^n]\) 系数,直接 bostan-mori 就行了。
关于 bostan-mori,想知道的可以自行搜索或者来找我给你详细揭秘。
P4287 [SHOI2011] 双倍回文
难度:水。
发现是一个回文串内的一半也是回文串就行。
直接变成数点问题,合法的条件就是,\(i+p_i\leq j,i\geq j-p_j\),树状数组直接神秘维护就行。
abc349_g Palindrome Construction
难度:水。
直接模拟 manacher 过程即可,会出现很多相等和不相等的限制,直接并查集维护相等限制,再从小到大填数,判有没有和前面不能相等的冲突就好。
记得先特判 manacher 中不合法的情况,不然复杂度不保证。

浙公网安备 33010602011771号