2023CSP 前总结

note:这个月的总结,由于中间似乎因为在从本地 copy 到 fzoi 的过程中,ctrl+A 出现了失误啥的,导致一段时间,同一个内容反复出现。

为了删除重复的部分,极有可能也同时删除了本来就正确的部分,寄。

10.1

上午状态害可以,但是感觉到有点不是非常的集中,想题的时候容易走神。

下午是经典小晕,晚上还行。

感觉今天的题都挺有意思的。

把列表里面的原题也简单看了看。

[IOI2023 集训队互测 R3T1]整数

增进了对于 FWT 的理解。

因为 \(b\) 的限制,很容易考虑数位 DP。但是如果按照一般的想法,从高位往低位 DP,那么会是难做的,难以找到一个突破 \(3^n\) 级别的思路。

很有 FWT 的感觉,应当尽量靠 FWT 方向思考。

solution1(ntf);

厉害的,考虑从地位向高位填数,设 \(f_{i, s}\) 表示填写到了低 \(i\) 位,\(s\) 集合的位置超过了限制的方案数。答案在 \(f_{59,\varnothing}\) 取到。

讨论转移:

思考最简单的情况,当 \(\forall i\),都有 r_i >> d & 1 == 0 的时候,那么转移就是 \(f\)\(b\) 的或卷积;当都满足 \(=1\) 的时候,转移就是 and 卷积。

(这里可以发现和从高位开始填写的不同,高位在顶上界,且 r=0 的时候,存在不合法转移 \(1\)

问题是每一个位置 \(r\) 的情况互不相同,看起来 FWT 做不了了。

但是这其实是可以做到的,将 FWT 看成是一种 DP,例如 FWTor 的实际上是在做 \(g[i][s] = \sum_{T\subseteq S, \max T = i} A_T\) 的 DP。

可以发现,由于 DP 的阶段是二进制最高位,所以非常契合这道题的需求,即对于每一个二进制位,有不同的转移方式。

大胆地,写出这样的 FWT(ifwt):

(r[t] >> d & 1) ? 
   (op == 1 ? inc(f[j + k], f[j + k + p]) : dec(f[j + k], f[j + k + p])) :
   (op == 1 ? inc(f[j + k + p], f[j + k]) : dec(f[j + k + p], f[j + k])) ;

正确性可以这样理解,FWT 本质是线性变化,所以每一个二进制其实挺独立的,也就是满足交换律

(没有必要是从低位到高位做,也可以是任意顺序做,只是这样比较方便;这一点其实从 IFWT 的过程就可以看出来,因为 IFWT 按理说应该从高到低,这样才是逆)

(上述的 \(g\) 的状态,也可以是先点一个排列 \(p\),然后 \(g[i]\) 表示填写了 \(p_1,p_2,\dots,p_i\) 的位置)

所以可以将上述 FWT 通过交换律,化归成前一段二进位需要做 FWTor,后一段需要做 FWTand,感觉一下,可以化到 n = 4,等价于只有 \(a_0,a_1,a_2,a_3\),需要做 or 和 and,这个可以暴力证明合法性。

上面说的暴力看起来不太聪明的样子,一种聪明的理解是,把 f,b 看成集合幂级数 \(\sum a_s x^{s}y^{s}\) 之类,然后现在需要求 \(f\times b\) 的某某项,那么这个就可以先固定 y,然后对于 y 相同的做 x 的 fwtor 搞成点值,然后做 y 的 fwtand。

这很子集卷积啊!

于是,怎么样理解子集卷积,就可以怎样理解这里的操作。

突然发现自己已经忘记了对子集卷积,以及其扩展的 exp/ln 之类的理解了,寄!

solution2:

对着最开始的思路硬做,设 \(f_{i, s}\) 表示填写到了高 \(i\) 位,\(s\) 集合的位置已经自由了的方案数。

后续见官方题解,大致思考和 sol1 差不多,只不过这里还需要构造状态形式,把不合法转移砍掉,使得转移可以做 FWT。

IOI2023 集训队互测 R15T1 翻修道路

k 很小,考虑挨个分析。

k = 1 是傻波,考虑 k = 2

发现走的路径一定是有一段是重复的,然后分叉开来

于是可以观察到,一个解必然是以 1 为根的外向树的形式,那么这个就可以 DP 了。

自然地,设 \(f_{u, i, s}\) 表示从 \(u\) 出发,子树内包含关键点集合 \(s\),使用 \(i\) 次翻修,最大距离最小值。

感觉一下,转移类似树上背包之类,最重要的问题是转移图不是 DAG,如何处理后效性

经典的,考虑使用最短路处理后效性问题,\(i,s\) 相当于两位分层图的感觉。

但是感觉转移的时候需要枚举的东西很多啊,而且不知道如何把最短路套进去,摆了。

solution:

这个其实是斯坦纳树。

对于经典的斯坦纳树问题,状态 \(f(u,s)\),转移有两种:

  • \(f(u, s) \leftarrow f(v, s) + val_u\) 表示一条树边
  • \(f(u, s) \leftarrow f(u, t) + f(u, s\backslash t) - val_u (t\neq\varnothing, t\neq s)\) 表示子树的合并

发现第二种转移方式非常优秀地解决了树形背包合并的时候枚举量巨大的问题。第一种转移显然是最短路形式。

简单分析两种转移之间的关系,以 s 从小到大作为 DP 的阶段,每次先做第二种转移,然后做最短路

这样复杂度是 \(O(3^k + 2^k m\log m)\) 两种转移的复杂度分开算。

本题也是类似的,区别是可能多了一个 \(i\) 的分层。

影响是做最短路的时候改为做分层图最短路,且第二种转移会多了两层枚举 \(i,j\) 的复杂度,导致时间复杂度有点高。

但是这个时间复杂度是小问题,由于转移的方式是取 max,枚举 \(i, j\) 可以用点力发现可以双指针。

[THUSCH2017] 巧克力

先思考如何找到最小的数量

如果点清楚了是哪 k 种颜色,那么给每一个格子分配 1 的边权,这又就是斯坦纳树了。

中位数是经典的,二分一下,<= 的权值搞成 -1,> 搞成 1,做上面的 DP,判定是否存在方案使得和 \(\le 0\)(最短路)。

当然,由于这里还需要保证选择的点数尽可能地少,将权值变成 inf - 1 和 inf + 1。

solution:

唯一的问题是没有办法 \(O(\binom{nm}k)\) 枚举颜色。

变态地,考虑随机化,考虑将 \(O(nm)\) 种颜色随机分成 \(k\) 组(映射到 \([0,k)\) 中),只要能随到某种分组方式,使得最优解对应的 \(k\) 种颜色恰在不同组就好,因为错解不优。

通过计算随机 200 组具有非常优异的正确性。

IOI2023 集训队互测 R8T1 环覆盖

等价于欧拉回路,等价于每一个点度数为 \(2\)

solution:

题目等价于有 \(m\) 个集合 \({u, v}\),问选择若干个集合,使得其 对称差 为 \(\varnothing\) 的方案数。

那么选择 \(i\) 个集合的答案就是 \([x^{\varnothing}y^i] \prod (1+x^{{u,v}}y)\)

其中 \(x\) 的乘法对应的是 FWT,\(y\) 是普通的乘法

要求的也就是多项式 \([x^{\varnothing}]\prod (1+x^{{u,v}}y)\),记 \(H = \prod (1+x^{{u,v}}y)\)

(擦,2 号补总结的时候发现后面的东西突然不太会了)

类似 [IOI2023 集训队互测 R3T1]整数 中提到的,\(x,y\) 两维是具有类似 子集卷积 的交换律的。

对于此处,更为 detail 的阐述是:

常规的,对 \(F(x) = \sum f_i x^i, G(x) = \sum g_i x^i\) 进行异或卷积 \([x^i](F * G) = \sum_{j\oplus k = i} f_jg_k\),其中 \(f,g\) 都是某一个数值。

这里,将 \(f,g\) 换为多项式 \((1+y)\) 并把乘法换成多项式乘法。

要求 \(H\),众所周知,卷积可以通过 FWT 换成点值表达式然后转化为点积然后 IFWT 回去

知道 \([x^s]FWT(1 + x^{u, v}y) = 1 + (-1)^{|s\cap \{u,v\}|}y\),必然是 \(1 \pm y\) 的形式

所以 \([x^s]FWT(H) = (1 + y)^{a_s}(1 - y)^{m - a_s}\) 的形式

于是,预处理 \(\forall a, (1+y)^a(1-y)^{m-a}\) 多项式系数,枚举 \(S\), 容易在 \(O(2^nm)\) 的时间内处理出 \(FWT(H)\),进而根据 \(IFWT\) 的定义式计算答案。总时间复杂度 \(O(2^nm + m^2)\)

这样实际上计算出了所有的 FWT(H),这是没有必要的。

由 IFWT 计算式,知道 \([x^{\varnothing}]H = \frac 1{2^n} \sum_s[x^s]FWT(H)\),知道肯定有很多 \(a_s\) 是一样的,考虑计算出 \(g[i]\) 表示 \(a_s = i\) 的数量,后续的计算是容易的。

根据 FWT 定义式,\(a_s\) 就是完全在 \(s\) 里的边数减去只有一边在 \(s\) 的边数。只需要能快速求一个点到一个点集的边数,那么在 S 加入或删除一个点时,这个变化可以 \(O(1)\) 维护,从而 \(O(2^n)\) 计算出所有的 \(a\)

总复杂度 \(O(2^n + m^2)\)

[CF1149D] Abandoning Roads

性质分析题。

贪心地,意图最短路都可以在最小生成树上。问题出在 \(b\) 边,思考什么时候一条 \(b\) 边不能,如果沿用 LCT 的思路的话,那么是不存在一个路径外的 \(a\) 边跨过这条 \(b\) 边。如果使用这个条件的化,那么显然需要知道这个路径的信息,或者说对于这个路径的选择进行一个非常严格的限定,这样是不好做的。

经典地,考虑 Kruskal 的过程,发现无论如何,会先把 \(a\) 边缩起来,使得图中只剩下若干 \(b\) 边,然后可以自由地挑一颗生成树出来。

于是可以知道 \(b\)\((u, v)\) 不合法的条件:

  1. \(u, v\)\(a\) 边缩在了一起
  2. 与之前选择的 \(b\) 边成环,也即是回到了一个曾经离开的块。

自然地,设 \(f[u][s]\) 表示当前在点 \(u\),已经从块集合 \(s\) 离开的最短路。

这样的复杂度是 \(O(2^n m)\) 之类的吧,考虑做最短路的时候由于边权只有两种,所以可以使用两个队列代替优先队列。

solution:

问题出在状态记录了 \(s\) 这一维太大了。

发现对于一个点数 \(\le 3\) 的块,块内两点距离 \(\le 2a\),所以最优解一定不会出现重返这个块的情况,所以 \(s\) 中不必记录这个块的信息,也就是说认为如果重复走了这个块也无所谓。

那么现在 \(s\) 的数量就是 \(O(n/4)\),复杂度 \(O(2^{n/4} m)\)

[CF750G] New Year and Binary Tree Paths

分类讨论题。

如果是一条从 \(x\) 开始的向下的长度为 \(d\) 的直链,分析知道权值是 \((2^d - 1)x\ \ (+1)(+3)\dots(+2^{d - 1} - 1)\) (括号表示可选可不选)

再简单分析一下,由于不存在进位的问题,所以可以从高位到低位贪心判定是否可以凑出 \(s - (2^d - 1)x\)

这部分的复杂度是 \(O(\log^2s)\)

如果是拼起来的 \((x, l, r)\),分析知道权值是 \((2^l+2^r-3)x+2^{r-1}-1\ \ (+1)(+3)\dots(+2^{l-2}-1)\ \ (+1)(+3)\dots(+2^{r-2}-1)\)

(感觉是可做的,没有继续想了)

solution:

这个涉及到进位的问题,所以不能使用刚刚贪心的算法来解决问题了。

发现都形如 \(2^x-1\),这样是难以处理进位问题的,如果枚举一共选择了 \(k\) 个,那么设 \(rst = s - 2^{r-1} + 1 - x \times (2^l + 2^r - 3)\),问题就变成了用 \(2,4,\dots, 2,4,\dots\)\(rst+k\)

这个可以设 \(f[i][j][k]\) 表示已经凑好了低 \(i\) 位,一共选择了 \(j\) 个数字,进位 \(k =0/1\) 的方案数。答案在 \(f[\log s][k][0]\)

复杂度 \(O(\log^5 s)\),鬼。

10.2

做了一些题,并复习了原题。

感觉自己是个飞舞,今天的题想不出来。

开门发现 5 到原题,但是发现基本都不会做。

上午状态不错,补写了昨天的总结,并再一次品味了一下 IOI2023 集训队互测 R8T1 环覆盖 对于 FWT 的应用。

下午爆肝了 4 道题,小指拇给干痛了...

晚上给列表穿了,写总结,简单回顾了一下 CDQ,然后打了一个二进制分组。

[QOJ 1432] [petrozavodsk winter 2020 Day 7 K] kilk

不妨设 \(x > y\),那么最长段长度自然是 \(len = \lceil \frac{x}{y + 1} \rceil\)

对于一个固定的 \(len\),一个自然的 DP,设 \(f_{i, j, 0/1}\) 表示末尾是 \(0/1\),填了 \(i\)\(0\)\(j\)\(1\) 的方案数,转移可以用前缀和优化干到 \(O(1)\),那么一次 DP 的复杂度就是 \(O(n^2)\)

至此已经得到了一个 \(O(n^3)\) 的做法,枚举 \(len\),暴力 DP。

solution:

聪明一点,发现实际上很多状态的值都是 \(0\),具体的,\(j\le \lfloor \frac{n-len}{len-1}\rfloor\),这很调和级数。舍弃没有用的,容易知道复杂度 \(O(n^2log)\)

[QOJ 1189] [petrozavodsk winter 2020 Day 2 C] Wall Painting

solution:

错解不优

首先的一个性质是,如果某一个点同时被三条线段覆盖,那么一定可以删掉其中一条使得答案不劣。

于是可以考虑 DP,DP 过程中可以默认一个点只会被两条线段覆盖,那么这样是非常容易计算贡献的。

具体的,设 \(f_i\) 表示已经覆盖了 \(1\dots i\) 的最大收益,对于 \(f_{r_i}\) 有三种转移:

  • \(r_j < l_i\), \(f_i\leftarrow f_j + (r_i - l_i + 1) x\)
  • \(l_j \le l_i \le r_j\),然后分讨二者颜色是否一致,有对应转移

包含肯定不优,忽略。

上述的转移容易使用线段树维护,复杂度 \(O(n\log n)\)

[AGC015E] Mr.Aoki Incubator

solution:

两个人相遇的时间 \(t_{ab} = \frac{x_a - x_b}{v_b - v_a}\)

自然想到放到二维平面上 \((v_i, x_i)\),那么 \(t_{ab} = -k_{ab}\),两者会相遇等价于 \(k_{ab}\le 0\)

考察一条传染链 \(a,b,c\),需要 \(t_{ab}<t_{bc}\),也就是斜率要递减。

考察染色 \(a\) 可以染色的部分,发现对于平面上 \(a\) 的左上角和右下角一定是可以的;对于左下角,看作是左上角的右下角。

所以,可以知道一个 \(a\) 染色的是一个区间 \([L,R]\)

那么剩下的问题非常简单,给定一些区间,问有多少中选择方式使得能够把 \([1,n]\) 都覆盖,这个是容易的。

[Gym 102979E] [petrozavodsk winter 2021 Day 9 E] Expected Distance

期望题

solution:

经典地,\(dist(u, v) = dep[u] + dep[v] - 2 * dep[lca(u,v)]\)

\(f[u]\) 表示 \(u\) 的深度的期望,有:

\[f[u] = c_u + \dfrac{\sum_{v = 1}^{u - 1}a_v(f_v+c_v)}{\sum_{v=1}^{u-1} a_v} \]

这个是 \(O(n)\) 的。

考虑 \(u<v\) 的 LCA 的期望深度,考察 \(v\) 第一次跳到 \(\le u\) 的某个位置的过程,那么发现 \(v\) 初始为多少并不会影响答案,所以第一次跳到 \(\le u\) 的位置为 \(i\) 的概率为 \(\dfrac{a_i}{\sum_{j=1}^u a_j}\)

\(g_u\) 表示两个点较小值为 \(u\) 时 LCA 期望深度。假如 \(i\) 恰好为 \(u\),那么贡献为 \(f_u\),否则为 \(g_i\)。那么有:

\[g[u] = \frac{f_ua_u+\sum g_va_v}{\sum a} \]

\(O(n)\) 解决。

[CF1578J] Just Kingdom

牛牛 DP 题

solution:

将每一个点的问题单独处理。

考虑一个自下而上的 DP。

\(cost_u\) 表示子树 \(u\) 需要的最少流量使得满足需求 \(i\),初始 \(cost_i = s_i\),其中 \(s_i\) 表示子树内 \(m\)(需求值)的和。

一步一步往上推,考虑 \(u\to fath\) 的过程。

由于分配流量是均分,除非一个点装不下,所以:

\[cost_{fath} = \sum_v \min\{cost_u, s_v\} \]

现在已经获得了 \(O(n^2)\) 的做法,自然的想法是优化这个 DP 过程,快速地跳转移。

发现如果某一个 min 取的是 \(cost_u\),那么 \(cost_{fath}\) 至少是两倍,知道 \(s_1\) 肯定是一个解,这启发我们快速地跳 min 都取 \(s\) 的过程,暴力跳存在 min 取 cost。

经典地,采用倍增的方式快速跳 \(min\) 均取 \(s\) 的过程,为了判定当前是否可以跳 \(2^j\) 步,设 \(g[u][j]\) 表示从 \(u\)\(2^j\) 步需要的最小的 \(cost\),并补设 \(f[u][j]\) 表示跳 \(2^j\) 步之后,\(cost\) 的增量,即其他子树的 s 和。

倍增转移略。

复杂度 \(O(n\log n\log V)\)

10.3 CSP 模拟赛 1

[Gym102354B] Yet Another Convolution

充分体现了整体二分的退让思想

给定 \(a,b\),求 \(c\),使得 \(c_k = \max_{(i, j) = k} |a_i - b_j|\)

首先需要发现只要会做 \(c_1\) 就好了,因为对于 \(c_k\),只需要保留 \(O(\frac nk)\) 的数据即可,所以这里是调和级数,最后给复杂度上一个 \(log\) 就好。

现在的问题是求解 \(\max_{(i, j) = 1} |a_i - b_j|\)

首先想干掉绝对值,经典的([CTS2022 D1T2] Mis),变成 \(\max \{a_i-b_j, b_j-a_i\}\),那么是同样的过程做两遍

现在的问题是 \(\max_i \{a_i - \min_j b_j[i\perp j]\}\),那么显然有 \(O(n^2)\) 的做法。

为了方便,一个小转化,\(b=-b\),那么现在的问题是对于每一个 \(i\),求出 \(\max_j b_j [i\perp j]\)

看到互质,想要上莫比乌斯,但是 \(max\) 太碍事了。

天才地,通过二分答案把一个最值问题转成判定问题,即二分一个答案 \(X\),判定 \(\sum_j [b_j\ge X][i\perp j] \ge 1\)

这个时候就可以上 \(\mu\) 了,可以得到 \(\sum_{d|i} \mu(d) \sum_{d|j} [b_j\ge X]\)

自然地,考虑这样一个整体二分的过程:

维护 \(s[d] = \sum_{d|j}[b_j\ge X]\),每次 mid 变化的时候,维护一个指针以快速地把 \(X\le b_j<X^{\prime}\) 之类的部分找到,并且暴力地枚举因子修改 \(s\)

对于每一个询问,暴力枚举因子得到 \(\sum_{d|i}\mu(d)s[d]\)

考虑复杂度是啥,指针会将整个区间扫过 \(\log n\) 次,将因子个数估计为 \(n\log n\),那么这里是两个 \(log\)

询问部分的复杂度是一样的。

最外层还有一个 log,总复杂度 \(O(n\log^3 n)\),常数很小,可以通过。

[CF1062F] Upgrading Cities

巧妙的清新题。

等价于一个点正图可达的点数+反图可达的点数 \(\ge n - 1\)

众所周知,DAG 求可达点数的方法是 \(O(n^2/w)\),无法满足要求

但是题目还有性质没有使用,即只允许至多一个点不可达。

考虑拓扑排序的过程,发现同一时刻,在队列中的点一定互不可达。

solution:

考虑一个点被取出的时候,如果队列空了,那么可达点的数量 + rst

如果队列里面还有一个点,考虑此刻的图形,必然是这两个点 \(u, v\) 是“割点”,将图分成了两部分。(假如实际上“同层”点有 \(\ge 3\) 个,那么 rst 的数量肯定不对了)

自然的,只要 \(u,v\) 在后续的拓扑过程中可达的点相同就好了。

也就是判定是否存在一个 \(w\),使得 \(v\to w\),且 \(in[w] = 1\)

反图再做一边,可以求出可达的点数。

[CF715E] Complete the Permutations

令人激动的计数。

简单思考,发现两个排列 \(p,q\) 的距离就是连边 \(p_i\to q_i\),设得到的置换环数为 \(x\),距离是 \(n - x\)

一个错误的思考是认为这些边都是无向的。

图上存在四类边:

  • \(a\to b\), \(a\to 0\), \(0\to a\), \(0\to 0\)

\(a\to b\) 缩成一个点,图上只剩下后面三类边是有意义的。

特别的,对于如果存在 \(a\),同时存在 \(0\to a, a\to 0\),那么这是一个 \(0\to 0\)

设处理过后,后三类边的数量分别是 \(c1, c2, c3\)

要对于形成 \(i\) 个环的情况都求出答案,已经有了生成函数的感觉。

solution:

考虑一个 \(0\to a\)\(0\to b\),合并之后还是 \(0\to a\);如果和 \(0\to 0\) 合并,那么会还是 \(0\to 0\)

注意与 \(0\to 0\) 合并并不会改变 \(c3\)

\(f[i]\) 表示一类边生成 \(i\) 个环的方案数,枚举 \(j\) 条边用于生成环,\(c1 - j\) 条边合并到另外一个一类或三类。

\[f[i] = \sum_{j = i}^{c1} \binom {c1}j {j\brack i} (c1 - j + c3 - 1)^{\underline{c1 - j}} \]

\(g[i]\) 是类似的,知道 \(h[i] = {c3\brack i} c3!\)

将三个数组暴力卷积即可做到 \(O(n^2)\)

模拟赛

15:15 skim over

15:40 T1

16:10 strike by T2

16:30 doubt! skip T2

17:00 T3 but doubt

17:10 find T3's bug through fc.

17:30 T4 GG,fxxk!

18:30 T2 GGG,fxxk!

启动的时候有点小晕,有点口渴,但是这都是借口。

期望得分和实际得分一致。

考场心态还是可以的,时间分配还算合理,主要问题在于被 T2 爆了。

被 T2 爆了,居然不会 \(O(n^2)\),没有想到枚举了 mn/mx 之后可以 DP 判定,而是采用了一个充满错误的贪心,而且发现贪心错误之后,居然没有意识到可以改成 DP 做。

T4 看到数据范围+题目名称,坚定认为是反悔贪心,但是贪不了一点。

T3 写了一个假做法,考场上以为复杂度计算方式和 kmp 等价,但是发现并不等价,本来挺得意的。

这样一看,这把只会 T1,T24 暴力都没打出来,T3 骗分。感觉自己纯 sb。

吃饭的时候心里面有点不愉快,但是心态没有想象中的爆炸,维持在一个近乎麻木的状态。

回家车上通过打了会儿音游和 wyx 社交,似乎已经忘怀了

晚上回家,摆了 2h /cf/cf/cf,只能说都是借口,纯懦夫,第二天起来玩不了一点,GGG!


T2 划分区间 segment

挺震撼的题目,考察对于 DP 的理解。

暴力地,钦定一个最小值,考虑 DP 求出满足这个最小值的最大值最小是多少。

设一个 \(f[i][0/1]\) 可以 \(O(n)\)

问题是显然不可以枚举最小值然后每次都暴力计算一边,考虑如何快速地做这个 DP

发现随着最小值增大,不可以单独成段的集合是单调扩大的,即总共只会有 \(O(n)\)\(f[i][0]\) 被设为 \(inf\)

联想到 DDP,关注到这个 DP 非常具有局部性(只关注相邻两个点),将转移写成矩阵的形式。

在这里,使用这样的处理方式:线段树维护 \((x = 0/1, y=0/1)\),表示左右端点是否和左/右侧合并时的 DP 值,pushup 是容易的


T3 西西弗西

上一个 SA,发现对于一个 A,满足条件的 AA 是 sa 上一段区间

将这个区间二分出来,还有的限制是后缀长度的限制(B 非空),那么是一个矩形加,单点求值之类,容易 \(O(n\log n)\)

10.4 CSP 模拟赛 2

上午订正了昨天的 T3 并加了一点 hack,并终于看懂了 T4。

感觉上午状态不行,因为昨天晚上没睡够,脑子略晕。

下午感觉状态不错,想题想到了脑子有超载的感觉,大概是全力都发挥出来了。但是总感觉不是非常集中,这是不太满意的。

模拟赛

时间:做了可能 1h30min 左右 T1,不会;soha 了 2h 的 T2,不会;30min 打 T34 暴力之类。

感觉这把已经充分发挥脑子了,但是结果却是惨淡的,也许我的实力也就是这样了。

晚上一直有点 emo,不想说话。

再一次深重地体会到压力,清楚地看到前方无数沟壑险峻。

我是否行走在错误的方向呢?


T1,死在了第一步,将题目转化为给定一个 \(p^k\) 个点的完全图,找出尽可能多的 \(p\) 元环,使得每一条边只被使用一次。

分析了一下度数,都是偶度,猜测一定可以到上界。

很自然地,由于有对称性,思考构造“步长”之类。

发现确实不太会啊,考虑 \(n = 9\),没有发现任何有扩展性的构造。

有点自闭,浏览了一下后面的题,发现 T2 看起来很有意思,T3 用脚都知道肯定是分析条件然后 DP,挺对胃口的,T4 不知道啥 DS。

那么还是回到 T1 吧,实在没有办法了,想起了之前一个关于二分图的构造,对称点连边啥啥的,还是不可以

算了算 \(\phi(p^k)\),彻底将 步长的想法 否了。

对着题目硬想了一会儿,充分开动脑筋,时间已经不太对了。


看到 T2,有种梦回 2022 省选 D1T2 的感觉,虽然那道题现在都没订正。

发现树非常容易,知道如果最后通过 same 边缩成了 x 个联通块,那么分配颜色的方案数是 \(k (k - 1)^{x - 1}\)

自然想到设 \(f[u][i]\) 表示子树 \(u\)\(i\) 个联通块的方案数,转移是树形背包,复杂度 \(O(n^2)\)

问题是处理非树边。

观察发现,\(n\) 大的时候非树边非常少,大胆猜测复杂度带有 \(2^{非树边个数}\)

如何才能计算钦定了 diff 和 same 的方案数呢

被之前的联通块的思维误导,认为同一个颜色必然处于同一个联通块之内,所以惊喜地发现 same 是可以钦定的(把树上路径用并查集暴力缩点),但是 diff 钦定不了。

就这样,踏上了歧途。

必须计算出恰好 \(s\) 集合的非树边是 diff 的方案数,这样才能顺利地乘上这些非树边 diff 的系数,否则系数不好搞。

可以计算出 \(g[s]\) 表示至少 \(s\) 集合的非树边是 same 的方案数。

容斥一下,\(f[s]\) 表示恰好 \(s\) 集合的非树边是 same 的方案数是 \(f[s] = \sum_{s\subseteq t} (-1)^{|t|-|s|} g_t\),容易做到 \(2^{m - n + 1}(m - n + 1)\)

那么总复杂度就是 \(O(2^{m - n + 1}\max(m - n + 1, n^2))\),非常可过,再给小数据设计一个暴力就好了!

写了 6.6kb,一直认为是没写对,soha 最后发现思路 G 了。

思维被限制的点:

  • DP 不敢把当前点颜色是啥放进 DP 状态
  • 坚持认为一定是带 \(2^{m - n + 1}\)

可能的破局的路径:

  • 真的尝试给小数据设计暴力,然后发现需要枚举颜色 \(\to\) 发现颜色枚举量不大 \(\to\) 为了用上枚举的颜色,不得不将颜色这一维度加入 DP 状态 \(\to\) 发现没必要记录 \(i\) 表示联通块个数 \(\to\) 发现 DP 是 \(O(n)\) \(\to\) 发现这个做法可以扩展。
  • 发现很难钦定 same/diff 边,为了点它,只能枚举颜色 \(\to\) 发现颜色维度可以加入 DP \(\to \dots\)

solution:

给每一个反祖边指向的祖先暴力枚举都点一个颜色,设一共点了 \(cnt\) 种颜色,那么设 \(f[u][c = 0,1,\dots cnt]\) 表示 \(u\) 的颜色。颜色是 \(0\) 代表 \([cnt + 1\dots k]\) 中某一种。

DP 转移是容易的,注意 \(0\) 代表了 \(k - cnt\) 种颜色,复杂度可以做到 \(O(nk)\)

设给 \(n\) 个数字暴力点颜色的方案数是 \(B(n)\),总复杂度 \(O(B(11) nk)\),不卡常


T3 DP

首先需要抽象出一个合法/不合法的条件。

考虑 \(s2\) 放入 \(b\) 的过程,必然是放 \(n,n - 1,\dots, 1\),那么会使先放一段 \([n, x]\),然后操作操作,放 \([x, y]\)

可以发现除此之外没有其他的合法方案。

考虑什么时候这个过程做不到。

必然是 \(s2\) 中被迫放入一个 \(y\)\(y\) 不能被放入 \(b\)(存在比 \(y\) 大的还在 \(a\) 中);然后 \(s2\) 被迫放入一个 \(x < y\),然后 G。

那么条件是 \(a\) 中不存在 \(n,x,m,y\),使得 \(x < y, n > x, m > y\)

此时可以考虑 DP 了,考虑从大到小放置数字,一个元素插入后作为不合法的末端,当且仅当前面两个比它大的元素中间夹了一个比它小的。那么也就是插入到一个地方就保证这个位置前面已经插入的所有元素中间不能再插入元素了。

\(f_{i, j}\) 表示填写了 \(i\) 个数字,当前还有 \(j\) 个空隙可以插入的方案数。

发现如果插入到前两个空隙(最开头/前两个块之间)的时候会使得 \(j + 1\),可以写出转移:

\[f_{i, j} = 2\times f_{i - 1, j - 1} + \sum_{k \ge j} f_{i - 1, k} \]

\(\sum\) 是后缀和,看起来就很能优化,通过思考:

\(f_{i, j} = f_{i, j + 1} - f_{i - 1, j} + 2 \times f_{i - 1, j - 1}\)

这很路径计数,从 \((2, 2)\) 走到 \((n + 1, 2)\),每次走 \((0, -1)/-(1,0)/2\times (1,1)\),且时刻保证 \(x\ge y\)

(写成 \(f_{i, j} = f_{i, j - 1} - 2\times f_{i - 1, j - 2} + f_{i - 1, j - 1}\) 似乎是不好做的)

枚举 \((1,1)\) 的个数,剩下两个的个数是知道的,有卡特兰数的系数。


T4 字符串 DS 呱呱呱。

10.5 CSP 模拟赛 3

早上过来觉得神清气爽的,一鼓作气给昨天 T23 干了。

然后莫名其妙有点心烦,简单浏览了一下 T4 的代码,磨蹭着准备做 二分图匹配 match

沉下心来敲了一会儿,卡死了。做得出来个 gb,根本没看懂,感觉这道题前前后后盯了差不多 4h,看不懂,滚粗。

看了一会儿风景,回来补了昨天总结。撕开伤口,才能治病。

模拟赛 3

第三场全真模拟赛,全真,三天的排名一天比一天低,已经到了 fzoirk40 了。

相信我不会被困难击败,失败的味道并不苦涩,切勿畏缩不前。

时间分配:5minT1 + 3hT2 + 40minT3 溃败了。

T2:将 \(7!\) 压入状态

T3:考虑逆排列

T4:考察对于 phi 的理解。

10.7 模拟赛 4 + pb 杂题

上午打模拟赛,下午订正,晚上听 pb.

下午开头有点小困,晚上听了一会儿有点麻木了,脑子动不了一点。

模拟赛 4

感觉心态处理得不好。

一眼给 T1 秒了,然后 T2 卡死。动不了一点,简单分析了一下 T34,觉得都有点抽象。

时间在 10:30 的时候心态感觉就有明显问题了,大概是最近失败太多次了,经历了很多次看到一个分析方向,然后分析到头,turned out to be 做不了/前置分析错了的情况,导致开始有点不想思考了。

这是 totally wrong 的。

其实感觉 T23 都挺有机会的,T4 打死都没往网络流想,比较失败。

考试结束,双目无神。中午打了一会儿暴力乒乓,爽死了!


T2:

首先有一个 \(O(n^2)\) 的解法,设 \(l/r_{t, i}\) 表示跳 \(t\)\(i\) 可达的区间,每次 \(l_{t + 1, i} = \min_{j \in [l_{t, i},r_{t, i}] j - x_j}\) 之类之类。

然后看起来寸步难行。

很容易想到二分答案,但是感觉二分出来一个 mid 没啥用,于是暂时搁置了这个计划

那么,探究一下上述过程,思考能不能快速地单点求 \(dis_{i, j}\)。发现可能存在先往右走,然后往左走的情况,比较烦人。

关注到一个性质是 \([i - x_i, i + x_i]\),这里是否有啥对称性相关的东西呢?

思考了一下,不太会用,疑心题目怎么会给一个没有用的条件,而不是直接给 \([l_i, r_i]\) 呢,可能唯一的好处就是保证 \(i\) 在区间中。

边数有点多,考虑先把边数优化一下。

类似 灯笼,一个可达的区间可以记录为 使得左右端点是其所值 的位置;感性一下,认为只需要对于每一个 \(i\),保留 \(i\to minpos, maxpos\) 即可,其中 \(minpos\) 是使得 \(j - x_j\) 最小的 \(j\)

考虑倍增,但是这个玩意有两条边,并不是树。

看起来 GG 了,放弃了。

拾起二分答案,发现只要能够快速求出某一个点走 \(mid\) 步能到的区间就好,自然的想法是倍增。

很可惜,被上方的分析误导了,认为倍增不了,摆烂了。

solution:

算是长见识了,倍增的转移并不一定是要 \(O(1)\),倍增其实更像分层的 DP,所以自然是可以上 DS 的。

这个是可以倍增的,具体的:

\[l_{2^t, i} = \min_{j\in[l_{2^{t - 1}, i}, r_{2^{t - 1}, i}]} l_{2^{t - 1}, j} \]

暴力的,每次二分一个 mid,然后花费 \(O(nlog^n)\) 的时间把 \(l/r_{mid}\) 合并出来。

高明的,考虑依次确定答案二进制每一位,从高到低依次尝试合并 \(l/r_{2^k}\)

复杂度 \(O(nlog^2n)\)


T3 略显可惜。

容易知道,最后一定形如 BBBAAAA

简单思考,发现这些 BA 实际上将序列分割成了两个部分,如果可以求出 \(f_{i, j}\) 表示在前 \(i\) 个里面恰保留 \(j\)\(B\), \(g_{i, j}\) 表示 \([i, n]\) 中保留 \(j\)\(A\) 的方案数;那么答案可以枚举分割点计算。

看起来很有希望,计算答案是 \(O(n^2)\),状态是 \(O(n^2)\),差的仅仅是一个 \(O(1)\) 的转移。

需要计算的是方案数,那么总方案数是什么呢,或者说,什么是一个方案呢,阿巴阿巴想不清楚。

GG。

solution:

钦定总方案数是 \(pa^{ned_a}pb^{ned_b}\),即现在只需要计算在 \(a\) win 了 \(ned_a\) 次,\(b\) win 了 \(ned_b\) 次后,序列形如 BBBAAA 的方案数即可。

感觉这个小转化非常轻灵啊

然后考虑一下 \(f\) 的转移,如果当前 \(s[i] = b\),那么 \(f_{i, j} = f_{i - 1, j + 1}\);否则,枚举干掉了 \(k\) 个,\(f_{i, j} = \sum_k f_{i - 1, j + k}pa^{k}pb\)

前缀和一下之类,容易 \(O(n^2)\)


T4

限制是 \(\forall i, A\le s_{i + k} - s_i \le K - B\)

当时只想得到差分约束,却忘记了一个经典的东西。。。

solution:

曾经也做过这种题,限制类似差分约束的,但是需要求最大值,此时有经典网络流建模。

10.8 pb 杂题

Jewel Game 大致懂了但是没有写

Many Many Cycles 最后一个细节没有懂

1st ucup stage 7 C Testing Subjects Usually Die,明白了多个凸函数 max+ 卷积的时候,最优取值点斜率相同的事实。但是推柿子一直推不出题解的样子,摆了。

晚上口胡了 CFdiv2 A-F,都胡对了且除了 E 都胡得比较快,hanx,又对自己有了一点信心。

打 ARC,龟速切掉 AB 之后被 C 吊起来打,最后发现是 md 奇妙的转化。D 当时以为是二分答案,结果是到现在还不会的蛇皮贪心。

22:05 了,但是机房还有很多人,也许自己做的真的太少了。

1st ucup stage 20 E Strange Keyboard

想错一个细节,调了好久。。。

思路非常自然,DP,然后上 Trie 树,发现需要同余最短路。

solution:

做到正解,还需要注意到如下两个点:

  • Trie 树上,\(\sum_u 叶子数量 = \sum |s_i|\)。于是可以暴力处理代价。
  • 同余最短路本质不同的边只有 \(\sqrt\) 种。

复习了一下同余最短路的转圈技巧。

Directed Vertex Cacti

有点神。

solution:

结论:答案是 \(n!\binom{\binom n2}{m}\)

只需要证明,给 \(m\) 条无向边定向成 DAG 并加环的方案数是 \(O(n!)\) 即可。

归纳证明, \(m = 0\) 的时候显然正确,每一个排列对应一组置换环,对应一组方案。

考虑新增一条边 \((u, v)\),讨论二者所属的环的关系,发现使得其满足拓扑序的方案均是唯一的。

Peaceful Results

有趣的题目。

大致是大力 Gauss 解方程,用两个自由元表示所有其他的所有未知数,然后 NTT 算方案数。

具体直接看:https://qoj.ac/download.php?type=attachments&id=1207&r=1

Treelection

solution:

首先观察到,判定两个子树大小相同的 \(u, v\) 是否是答案的过程几乎一致

然后注意到,如果 \(siz[u] < siz[v]\),那么判定 \(v\) 的时候可以近似把 \(u\) 子树删掉

那么,智慧的,发现如果(通过二分)得到 \(w\) 表示极限情况下只能满足所有节点的票数 \(\le w\),此时如果 \(siz[u] > w\),那么 \(u\) 是答案;如果 \(siz[u] < w\),那么一定不是。

只需要判定 \(siz[u] = w\) 的情况是否合法。

合法的唯一希望是,因为 \(siz[u]\) 少了一票,\(u\) 的所有祖先都少了一票,然后胜利。

这个是容易判定的。

Hurricane

solution:

感知一下,很多点对的距离不超过 \(2\)

具体的,有 \(\binom n2 - m\) 对都是 \(1\)

那么只需要考虑原图上有边相连的 \(m\)\((u, v)\)

接下来有两种做法:

  1. 发现如果 \(deg_u + deg_v >= n\),才有可能距离 \(2\),于是至少要求 \(\max(deg_u, deg_v) \ge \frac n2\), 提出所有 \(deg \ge \frac n2\) 的点暴力跑 \(O(n + m)\) 的单源补图最短路,复杂度 \(m\sqrt m\)
  2. 设图中 \(deg\) 最小的点是 \(w\),发现如果 \(u, v\) 不和 \(w\) 原图上直接相连,那么答案是 \(2\);否则,对这些和 \(w\) 直接相连的点跑最短路即可。由于 \(w\) 度数是最小的,所以复杂度也是 \(m\sqrt m\)

10.9 模拟赛

再次被斩于马下,可能自己确实在舒适圈待得太久了。

没有考好的可能借口是考试的时候鼻子不太舒服,导致脑子有点昏沉。

T2 纯消愁,一直在二分求使得 \(i\) 不会产生贡献的最小时间,调了 2h 的树套树,发现是 \(n,m\) 写反了。而且时空是 \(log^2\),本来以为会先 MLE,没想到先 T 飞了。

11:00 放弃 T2,后面 1h 非常不集中,脑子的各种 rubbish 往外冒,受不了一点。


下午确认了昨天口胡的 CF 的做法的正确性,然后开始订正 T3。

自己打,最开始一直过不了第二个样例,总是会多出一些莫名其妙的不合法状态居然有值。

调了可能 2h 发现是最开始的时候赋初值只给一部分的位置赋了 -inf,纯犯病。

发现还不对,经过深入的输出,发现了一个致命的问题:

我误认为有这样一个性质:某一个 \(u\) 的最开头/末尾的位置的 corner,如果被 \(u\) 选择了,那么 \(u\) 的祖先在之后的操作中没有再选与这个 corner 相邻位置的可能(这样肯定不优秀,不如直接让这个祖先把 \(u\) 选了位置也选掉),即相当于从这个 corner 把序列劈成独立的两个部分。

如果有,那么 DP 是容易转移的。

可惜没有,反例是一条链,出现的问题是每一个点必须选择一个子区间。

思考过后,发现难以在之前的 DP 上修补,GG。

solution:

注意 \(f_{u, i, 0/1, 0/1}\) 的意义是 有/没有 选择 \(u\) 左端点的左侧/右端点的右侧 的区间。(而不是有没有选 \(u\) 的 corner)

在这样的状态下,有聪慧的转移方式,具体略。


最后 1h,感觉整个人处于一个一点都不想动的状态,fxxk!

10.10 自习

下午看 1st ucup stage 7 C Testing Subjects Usually Die,明白了多个凸函数 max+ 卷积的时候,最优取值点斜率相同的事实。但是推柿子一直推不出题解的样子,摆了。

晚上浏览复习了一下 7,8 月的总结。

纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘。

P6036 Ryoku 爱学习

答案式子经过诸多简单前缀和的处理,可以做到 \(O(n)\),但是这样的问题是精度不够。

尝试构造递推式可以有效地提升精度。

这揭示了期望 DP 提升精度的方法。

吃球有方

蚌埠住了。

首先可以把贡献推成 \(2(x|y) \bmod C\) 的形式,但是由于不仅存在 \(-C\) 的情况,还有 \(-2C\) 的情况,彻底抹杀所有可能

经过思考,发现实际上是给定一个完全图,然后挑出一个权值最大的 DAG

由于只有 n - 1 条边,所以实际上是外向树。

由于我是傻波,所以到现在都没有看出来可以直接 Kruskal 求最大生成树。

感觉这个问题有点难啊,考虑了一下斯坦纳,发现斯坦纳是必须要记录 \(2^n\) 这一维度的。

考虑贪心,每一个点尝试先选择一条最大的边。发现这样可能会搞出若干个环,有点难泵。

一时间有点不会,对自己产生了一点怀疑。

探究了一下样例,没有新的思路。

考虑修补刚刚的贪心,发现对于成环的情况,可以把这个环缩成一个“大点”,这个大点代表了若干数中可以活任意一个。然后对 大点们 继续做贪心,每次求的是两个块之间的边的最大值。

计算一下复杂度,发现每次点数至少减半,那么就是 \(O(n^2\log n)\)。可能有一个并查集,但是肯定可以过。

惊觉,md,这不就是 Boruvka,不如直接 Kruskal。

蚌埠住了,对自己越来越失望了。

铁索连环 I/II

考虑 TYPE = 0,发现本质上是卷积的形式,考虑了一下 meet in the middle,由于贡献拆不了,发现不太刑

思考,发现没有必要求出所有位置的卷积,放在 Trie 树上思考,只有 \(log\) 个位置有用。

简单思考,使用线性基即可。

Trie 树上暴力合并,复杂度是 \(O(nlog^3V)\),但是应该跑不满。

仔细观察,考察 L 在 Trie 树上行走的过程,发现询问的是若干个无交的子树,那么总插入次数是 \(O(n)\)

插入复杂度已经解决,询问复杂度 log^2,可以接受。

铁索连环 III

下不了手。可以说是原地发呆 1h+

转化一下,类似 铁索连环 I/II,可以拆成 log 个问题,每个问题是选一个集合 \(S\),使得 \(\oplus a_i = C\),求 \(\max\oplus b_i\)

前几天做了 IOI2023 集训队互测 R8T1 环覆盖,想到把这个写成一个生成函数的形式。

\(H = \prod (1 + x^{a_i}y^{b_i})\)

不太好求 \([x^{C}]\),转化一下,新增一个 \(a_{n + 1} = C, b_{n + 1} = 2^{35}\),那么 \(C\) 在最优情况下一定会被选中,现在求 \([x^{\varnothing}]\)

和 环覆盖 一样的流程,可以推的 \([x^{\varnothing}] = \frac{1}{V} \sum_{s}[x^s]FWT(H)\)

虽然可以将 fwt 用定义式拆开,但是还是 GG 的。

发现大家给的难度分是 2400,疑心是新型诈骗。

solution:

感觉有点高妙。

由于 A,B 都是进行 xor,考虑这样将 A_iB_i 放到一起建立线性基:

void insert2(int x) {
	for(int i=29;i>=0;i--) 
      // ordinary insert x into p3[]
}
void insert1(int a,int b) {
	for(int i=29;i>=0;i--) 
		if((b>>i)&1) {
			if(p2[i]) a^=p1[i], b^=p2[i];
			else return p1[i]=a, p2[i]=b, void();
		}
	if(a) insert2(a);
}

为什么要这样做呢?可以这样考虑线性基求最大值的意义,实际上是在执行一个数位 DP。

在这里,我们以 B 为主地做了一个线性基,做得都是线性变化,所以显然不会对于 A 的线性空间产生任何的影响;

而对于那些 \((a, b)\),其中 \(b\) 非基底,那么这意味着存在基地的线性组合使得 \((a,b) \to (a^{\prime}, 0)\),那么此时的 \(a^{\prime}\) 是否选定不会影响答案的大小,而可以任意地调整以符合 \(L\) 的限制,所以将其插入另外一个线性基即可。

接下来,执行数位 DP(贪心),设之前选出了 \((A, B)\)

如果 ~ B >> i & 1,那么现在需要考虑的问题是能不能选则当前这一位。

能选当且仅当选择之后,可以通过 \(a_i\) 调整过来,此时,可以使用的 \(a\) 不仅仅有已经 insert2 的,还有 \(\forall j<i, p1[j]\)

所以,将 p1 都 insert2,在 p3 中询问一下 A^p1[i] 为初值可以得到的最小值,如果可以满足条件,那么令 A^=p1[i], B^=p2[i]

问题看上去已经解决了,不过其实还有一点。

注意实际上我们可能不得不使用某一个 \(j < i, p1[j]\),那么我们其实对应强制要求使用 \(p2[j]\),这样可能会使得答案变小。

所以,对于 B >> i & 1 的情况,也需要执行如上的过程以判定答案是否需要变小。

我会魔法

看到 sqrt 非常害怕,取一个 ln。

\(G\) 是几何平均数,发现 \(\ln G =\frac 1n \sum_{i = 1}^n \ln x_i\)

感觉就可以做了,处理一下 AC 自动机上每一个点对应的 \(n\)\(\sum ln\) 就可以 DP 了。

但是疑心一个很大的问题,就是 ln 的精度。

因为曾经有一个最短路题,使用了 ln,但是被卡精度卡麻了

但是如果不使用 ln 的话,非常难解决比较大小的问题,GG

solution:

阿巴。使用上面的方法,可以得到一个 \(f_{i, j, k}\) 表示前 \(i\) 个字符,当前在 \(j\),一共匹配了 \(k\)。答案是 \(\max \dfrac{f[n][\star][k]}{k}\)

但是这样是 \(O(n^4)\) 的,G。

面对平均数,使用二分答案,将每一个点的贡献 \((sum, n)\) 变成 \(sum - n\times mid\) 即可。

要回溯构造方案,烦。

[ZJOI2017] 树状数组

正确的概率是 \(val[l - 1] == val[r]\)

想法是将修改的区间分成三种计算概率之类之类,但是发现这样是很难的。

感觉脑袋空空了。

solution:

考虑一次修改对于答案的影响,发现是区间的。树套树暴力维护所有 \(ans[l][r]\)

提醒了 DS 暴力维护 这一条道路。毕竟这道题的输入方式长得就很 DS。

10.11 oyds 杂题

我是菜波!

发现自己在最近的训练过程中,看题解的时候,忘记了思考一个重要的问题:我应该如何才能想到这个解法?

早上先花了 1h 左右的时间处理昨天晚上 ZJOI 树状数组 的问题。

上下午状态还行,晚上不太行。

[LuoguP9523] Copy and Paste 3

开胃菜

分析过程,发现很有意思的一点是每次是剪切,而不是拷贝,这会带来一个清空,带来阶段的划分

最后一步的填写方案形如 AXXXBXXCXXD,即 \(X\) 是剪切板;那么上一轮的任务自然是凑 \(X\)

\(f[l, r]\) 表示凑出区间 \([l, r]\) 的最小花费;转移需要枚举一个 \([i, j] \in [l, r]\),然后计算出 \([i, j]\) 的不交出现次数之类以计算贡献。

需要枚举的区间太多了,想要将其变少一点。

过程可以理解为先凑一个 A,然后开始 Copy,然后补一段 D。

那么,对 \(f\) 附加一个二维 min 的转移,只做 \([i, j]\)\([l, r]\) 的前/后缀的转移即可。

这样的复杂度看起来清秀了一些,同时注意到,如果一个 \([i, j]\)\([l, r]\) 出现了多次,那么这个区间的长度不会太大;如果长度大,那么跳不了很多次。

可以猜想最后的解法复杂度会带上一个调和级数。

需要预处理 \(nxt[i][len] = \min_{j > i, lcp(i, j) \ge len} j\),这个是容易的。

阿巴阿巴算算复杂度,发现还是很大。

solution:

不要计算 \(f[l,r] = \min f[i, j]+cost\),而是枚举 \([i, j]\) 计算 \([i,j] \to [l,r]\) 的贡献

这样优秀的地方在于,可以发现,第一种方式为了计算 cost 开销巨大,而其实多个状态之间的 cost 计算有很大一部分可以公用;所以采用贡献的方式进行 DP,可以良好的解决问题。

复杂度 \(O(n\log n \ln n)\)

[QOJ1249] Goldfish and pikes

直接暴力选小的直到能够选比他大的。

大胆猜测这样只会选择 \(log\) 个区间,事实果真如此。

剩下一个 DS 问题,混合一点时间和耐心,可以通过。

bugs:

  • 只能吃严格小于的,不可以吃等于的
  • lower_bound(vec.begin(), vec.end(), p),应该填写 pii(p, 0),本来是 vector<int> 的,后面改成了 vector<pii> 但是这个位置没有对应修改。编译器报了一大堆没有用的 rubbish,但是就是没有告诉代码具体哪一行出了问题,气死了。
  • 线段树上二分查询的常见细节问题。

[gym103687E] Easy Jump

如果 \(S = 0\)\(T_1\ge T_2\),那么可以视作不会用蓝回血,这部分是简单的期望 DP。

对于可能使用蓝的情况,可以设出状态 \(f_{i, H, S}\)

转移出现了 min,不同于之前的二分套路的是,这里转移的未知数元有很多,所以二分某一个量之后也并不能推出剩余的情况甚至判定解。

仔细分析这个游戏过程,可以得到一个贪心:如果当前有血,那么就 rush;否则能用蓝就用蓝;恢复一格血之后,立马继续 rush。

不难确证这个贪心的合理,发现题目中还有一个特殊的操作,即某一些点是无限蓝的。

那么,还有一种可行的策略就是趁着当前是无限蓝,赶紧多恢一点血量,这样以后 rush 比较方便。

分情况转移,对于有限蓝的情况,经过贪心策略,发现转移只有一种,即完全去掉了 min。

solution:

对于无限蓝的情况,暴力枚举阈值,即一定得回复到这个阈值才会继续走下去。

复杂度 \(O(nH^2)\)

[AT_utpc2021_l] Maze Game

妙题,从最终的状态入手,一击毙命

solution:

若图中存在点使得删去它后 \(S,T\) 不连通,那么 \(A\) 可以一步获胜。

否则,双方都不会删去一个点使得删去它后会产生一个点使得删去它后 \(S,T\) 不连通。那么到最后图上会剩下两条 \(S\to T\) 的不交路径。此时一方无论如何操作都会使得另一方获胜。

因为这是二分图,所以这两条路径的并的点数一定为偶数。那么只用判断初始时非障碍格数量的奇偶性,就能知道到达终态步数的奇偶性。

时间复杂度 \(O(∑nm)\)

注意不能直接套割点的板子,判定的一定是从 \(s\)\(t\) 路径有没有必经点,不应关注图的其他部分。

10.12 模拟赛

pyb 给了一套简单题,但是非常遗憾,实力有缺,也可能是打的时候心态太放松了。

先想完再写的,开始写的时候已经 10:10 左右了,不知道咋就想了这么久,感觉 T124 都想得挺快。

实现的时候写出了亿些的 bug,不好评价。

下午给大家讲今天的题,由于脑子还是乒乓球的形状,差点求大/cy

下午写了写 oyds 的列表。发现群友在看我一年前的总结,自己也看着玩玩儿,看到之前的思考,觉得自己真不如一年前的我!


进入 T3,发现有点答辩,先将编号 + 1。

分析了一下操作,发现一个岛屿的轮廓是 \(x, (2x, 2x + 1), (4x + 1, 4x + 2), (8x + 3, 8x + 4), \dots\),那么用 \(x\)/\((2x, 2x + 1)\) 即可代表一个岛屿

思考一个岛屿一步可以到的位置。

发现如果 \(x\) 是偶数:

  • \(\lfloor \frac x2 \rfloor\)
  • \(2x, 2x + 1, 4x + 1, 4x + 2\dots\)
  • \(x / \texttt{lowbit}(x)\)

那么答案的路径会长成啥样子呢?一定是 \(a\) 跳了若干步 \(3\),然后跳若干次 \(2\);显然不会跳 \(1\),跳 \(1\) 不如跳 \(3\) (??? 埋下伏笔。)

\(2\) 很烦,发现 \(2,3\) 互为逆操作,改为 \(a,b\) 同时跳 \(3\)

那么这样似乎这道题就非常简单,只需要 \(a, b\) 一直调到 lca 就好,特殊处理一下跳出去的情况就好。

首先被一些奇奇怪怪的细节卡着写了半天。

然后发现样例还是过不了,怀疑的方向是某某细节写挂了,此时的时间已然迫近 11:30。

摆烂了,去写 T4,但是怎么写得完呢?而且实际上 T4 还想错了小一个细节,误导使用 set 而非线段树。


最后由于 T2 写错了一个细节导致抱灵,光荣地获得华丽丽的总分 100。

难道 1 个月不碰 OI,真的有这样大的影响?


solution:

T2:可以发现两个障碍之间的方案只有 1,方案数仅贡献在两端。

T3:跳 \(1\) 是 useful 的,只跳 \(3\) 的反例:

19 21

  • 如果一直跳 \(3\)\(19\to 2\to 1\), \(21\to 5\to 1\)
  • 如果加入跳 \(1\)\(19\to 2\), \(21\to 10\to 2\)

关键的一步是 \(21\to 10\)

为了加入跳 \(1\) 的步骤,可以将 \(a,b\) 二叉树上到 \(1\) 的一条链,以及这些链上点跳一步 \(3\) 可以到的位置统统加入待选集合,然后对这个集合里面的点建图跑 bfs。

T4:

考虑为什么出题人出的是交换两个数字而不是任意指定,因为他不会对吧。——lxl

虽然在这里,由于题目的限制,任意指定和交换两个数字是等价的。

首先可以注意到一定是跳 1 个 \(+1\)\(n\)\(+2\)

于是暴力就是枚举 \(+1\) 的位置,知道必然是在某一个 \(x\to x+1, \texttt{x is even}\)

自然的,考虑优化判不合法的方法,抽象出每一对数字对于 \(x\) 的限制,很容易发现可行的 \(x\) 一定是若干段区间,且每一个限制都是某一个区间不可以选。

那么剩下的内容就很简单了,(注意由于可行的 \(x\) 可能是多段区间,所以不能认为只存在某一个区间,而 sb 地偷懒使用 set 维护),每次标记一个区间不可选的时候,线段树区间 + 1,只需要用线段树求最小值和最小值出现次数即可,这时经典的。

TopCoder 15903 EllysNim

贪心题

考虑将整个过程拆分成若干次操作,每次操作要凑出 \(2^{d}\)

由于只能加,凑 \(2^{d}\) 必然是将奇数个数字的后 \(d - 1\) 位往上抬。

发现有若干性质:

  • 将某一个数字升到 \(2^{d}\) 之后,后 \(d - 1\) 位都会变成 \(0\)
  • 若当前已经有很多 \(0\),那么只会改动其中某一个,因为如果将两个 \(0\) 升到 \(x, y\),影响是 \(x\oplus y\),影响力不如 \(x + y\),即只对一个 \(0\) 进行操作
  • 如果当前已经有了一个 \(0\),由于第二个性质,所以将某一个数字抬升到 \(2^{d}\) 的唯一理由是为了修改这一位的异或和
  • 因为仅仅是为了修改异或和,所以只会拉一个值上来,多个 0 是没有意义的,放到后面进行操作这样肯定不劣
  • 一定拉最大值上来。比如 \(a < b\),如果拉 \(a\)\(2^{d}\),不如拉 \(b\),有需要的时候,将 \(a\) 拉到 \(b\) 即可(这其实类似反悔贪心)

所以,设 \(d\)\(\oplus a_i\) 的最高位的 \(1\),每次就是拉一个最大值到 \(2^{d}\),然后往下做。

这个算法还有唯一一个问题,对于类似这样的情况:

11111
11111
11111

那么,此时会想要拉一个 \(2^4\), 但是发现拉不动一点。

手模知道,此时的方法应该是拉两个 \(2^5\) 上去。

所以,还需要枚举一个 \(d\) 表示 “拉”操作的第一个位置,如果当前位置本来异或和为 \(0\),那么贪心地拉最大/次大值;否则拉一个最大值即可。

暴力实现,复杂度 \(O(n\log^2 V)\)

[CF1870F] Lazy Numbers

自己想出大半的题(看了一点 hint)

草稿纸上写一写按照 \(k\) 进制下字典序排序后的结果,思考一下一个数的 rk 咋算。

发现需要计算诸如 \(1\) 开头的数字数量、\(2\) 开头的数字数量 \(\dots\)\(11\) 开头的数字数量 之类。

那么,放到 Trie 树上进行思考,发现一个数字的 rk 就是 dfs 序,而其值就是 bfs 序。

所以求的就是 Trie 树上 dfn = bfn 的位置个数。

感觉还是有点难,思考假如我已经知道了某一个位置合法,会有啥性质吗?

发现如果一个叶子合法,那么其同层的叶子也会合法。直到层数改变之类。

所以,每一层合法的位置必然是一个区间!

所以,对于每一层二分这个区间的左右端点即可!

二分过程中,需要计算某一个数字的 rk 以判定,这个计算是容易的。

10.13

坏了,早上起来有点低烧(37.4),大概是昨天下午打了球没带换的衣服。早上吃了点药过来

坏了,烧了一天。。。。(以为 pyber 看出来了,就没有说),脑子思考一会儿就会发痛 /zk/zk/zk

今天要么在睡觉,要么在给高一讲题,要么做题。通过讲题,对题目有了更深的理解。

中午吃了药,感觉退了一点烧,但是始终出不了汗。

晚上 tsx 听得断断续续的。

回去发现已经接近 39 度了,赶紧吃药,吃完赶紧睡觉。

[THUPC 2023 决赛] 老虎

首先,通过期望线性性,设 \(T_i\) 是可以判定出是 \(i\) 的集合,那么 \(i\) 的答案就是 \(\sum_{s\notin T_i} P_st_s\)

其中 \(P_s\) 表示走到这个状态的概率,\(t_s\) 表示在这个状态停留的时间。意义也就是“浪费”的时间。

注意到如果一个集合 \(s\) 合法,那么 \(s\) 的超集必然合法,所以不会出现可能走到 \(s\) 的过程中经过了某一个 \(t\in T_i\) 的情况。

可以写出:\(t_s = \sum_{x} (\prod_{i\notin s} 1-p_i)^x = \dfrac{1}{1- \prod_{i\notin s} (1-p_i)}\),意义是枚举至少停留 \(x\)步。

\(P_s \times \dfrac{\prod_{i\in T, i\notin s} p_i \prod_{i\notin T} (1-p_i)}{1- \prod_{i\notin s} (1-p_i)}\),意义是将 “跳出 S” 的方案数作为总方案数。不关心在 \(s\) 转了多少圈。

知道 \(ans[i] = \sum_{s}P_st_s - \sum_{s\in T_i}P_st_s\),而 \(\sum |T_i| \le 3^l\)

唯一的问题在于计算 \(T_i\),可以视作图上走路径问题,有 \(n\) 个起点形如 \((2^{l} - 1, s_i)\),表示已经知道了 \(2^{l} - 1\),知道具体值是 \(s_i\),那么某一个 \(T_i\) 合法当且仅当 走到 \((\star, T_i)\) 的 方案数 \(=1\),这个是一个类似高位后缀和的问题。

[gym103428B] Subset

做了一个下午的题,虽然中间有几段时间在睡觉/shui

思考一下,发现求解类似数位 DP,且难点在于保证选择的 \(k\) 个数字互不相同。

solution:

\(f_i\) 表示选择 \(i\) 个不在意是否存在相同数字,使得 ppc = b 的方案数。枚举第一个不顶上界的位置,可以类似 提出一个数控制奇偶性 地计算出 \(f\)

注意要特别考虑 ppc(n) == b 的情况。

设答案是 \(g_i\) 表示选择 \(i\) 个不同的数字使得 ppc = b 的方案数,显然有关系:

\[f_{a} = \sum_{b\le a} g_b coef_{a, b} \]

(这其实同时解决了 环覆盖 一题的反演问题)

其中 \(coef_{a, b}\) 表示转移系数,具体的,设 \(h_{i, j}\) 表示选择 \(i\),其中 \(j\) 个数字出现奇数次的方案数,\(h\) 的计算是简单的。

那么 \(coef_{a, b} = \frac{h_{a, b}}{n^{\underline{b}}}\)

常规的,为了推出反演的形式,需要解系数的矩阵的逆,但是这样是 \(O(n^3)\)

注意到限制 \(b\le a\),所以它已然是一个下三角的矩阵,首先 \(g_1 = \frac{f_1}{coef_{1,1}}\),然后可以算出 \(g_2\),然后可以算出 \(\dots\)

略微卡常。在没有找到任何一份 std 辅助理解,单凭借题解,一点点摸索克服题解所省略的部分,写出来还是非常有成就感的。

一个奇怪的地方:反演的时候应该将 \(g_{0}\) 作为第一个被求解出来的数字,即应该是 \(g_0 = \frac{f_0}{coef_{0,0}}\),但是 \(f_0\)\(g_0\) 都是不合法的状态。

10.14 CSP 全真模拟赛

半夜出了一身汗,换了衣服继续睡,早上 8 点钟起床,吃了点药 9 点中发现只有 37.2 了,很高兴。

决定先写一道题试试看,写了昨天晚上已经听懂的 tsx 的 T1。

9:30 左右差不多写完,通过之后发现身体状态似乎还行,于是准备上路了。

路上就感觉有点不对,体温记一测发现已然是 37.5,知道又要启动了(

到学校,给 [CF1188C] Array Beauty 秒了,然后花了很久时间理解 [LOJ3575]「USACO 2021.12 Platinum」Paired Up,感觉这个时候状态已经有点低迷。

中午放学,发现 38.5 ...坏了。简单吃饭然后吃药,舒服了一点,但是出不了一点汗。

跟 wyx 开玩笑说,本来早上的时候病毒已经在革灭殆尽之际,然后被 OI 转移了精神,如同放虎归山,反陷我于危机存亡之秋。

车上挺热的,大概总算还是出了点汗吧,到机房门口的时候发现情况出乎意料地好,只有 37.7 度


开始考试了。

时间分配:1h30min T1 + 2min T2 + 2h T3 + 20min T4

T1 很快想到了(按照次序想到): 拆成每一个素数、分讨 \(\sqrt V\) (并发现 \(\le \sqrt V\) 的素数似乎只有 90 个/jy)、只有 nlogn 个位置有值、允许离线(莫队、扫描线)

那么,简单推到拆成每一个只因子之后怎么计算贡献,发现有点难泵,大致是

\[p^{\sum_{s\in[l,r]} \min_{i\in s}c_i} \]

仅考察后面的柿子

\[\begin{align*} &{\sum_{s\in[l,r]} \min_{i\in s}c_i}\\ =& \sum_{x = 1}^{log} x (2^{c_i = x 的个数} - 1) 2^{c_i > x 的个数} =& \sum_{x = 1}^{log} 2^{c_i\ge x 的个数 - 1} \end{align*} \]

但是无论是那个计算式,看起来都要枚举一个 log 的样子,想到,纵使我能 \(O(1)\) 获取所需要的 \(cnt\),我的枚举量也是 \(90 \times 20\) 左右,乘上一个 \(q\),受不了了一点。

然后有点小茫然。

继续观察题目性质,发现有值的位置很少,思考将这些数值拍平试试,但是并没有什么方便之处。

发现题目可以离线,首先考虑莫队。但是感觉莫队自带一个 \(n\sqrt n\) 已经顶满了,而且莫队做 T1,我觉得就算是写出来也是吃亏的(ljy 他们出的题的题解里面经常提到这句话)。

那么考虑扫描线,发现移动 \(r\to r + 1\) 之后,\([1/2/ \dots r-1, r]\) 答案的变化量根本无法使用啥数据结构快速维护,G。

然后更确认了莫队做不了,因为我不会指针移动 \(r\to r + 1\),更何况更为复杂的 \(r\to r - 1\) 的情况。(这里实际上由于脑子状态不好,已经完全混淆了扫描线和莫队了)


时日无多,得先看看后面的题。

读了读 T2 的题目,对题意有点问题,而第一个样例无法解决我的问题,第二个样例没有样例解释,不想管了。

读了读 T3,眼前一亮,觉得是目前看来最可做的题。

读了读 T4,不想动脑子了,写了一个动态开点的字典树滚了。


虽然 T1 的暴力还没有打,此时时间 16:00,觉得优势在我,开始动 T3。

发现,某一个点如果被染色,那么如果有机会,必然会将它的前缀边染色,而不会动后缀边。

进一步思考,容易发现一个染色方案和题目所要求的序列构成一个双射。

那么,类似 CTS2022D1T2 Mis,经典地,发现“如果两个点在树上距离甚远,那么这两个点基本无关”,也就是说非常有局部性,非常可 DP。

先设了两个状态 \(f_{u, 0/1}\) 表示 \(u\)\(fath\) 染色 / \(fath\) 染色 \(u\)\(u\) 子树内部方案数。

转移的时候,发现可能 \(u\) 预先被某一个儿子染色了,且这个儿子的染色时刻比 \((u, fath)\) 小。

所以补一个 \(f_{u,2}\) 表示 \(u\) 被某一个 \(rk(u, v) < rk(u, f)\) 的儿子 \(v\) 染色了。

想起来 \(u\) 还可能没有染色,再补一个 \(f_{u,3}\) 表示 \(u\) 没有染色。

看起来一应俱全了!草稿纸上高兴的推出了转移,发现没有对任何新状态的需求,转移是封闭的,而且看起来很容易优化到 \(O(n)\)

写完发现能过样例 \(1\) 但是过不了样例 \(2\),经过对于转移柿子和代码的检查,修改过后发现能够过样例 \(2\) 但是不能过样例 \(1\),气死了。

有点茫然。

思考发现,对于一个 \(v\) 而言,如果 \(u\)\(f\)/之前的儿子 提前染色了,那么 \(v\) 实际上唯一的限制是不能染色 \(fath\),所以贡献不应该只是 \(f_{v,2} + f_{v, 3}\)

补设一个 \(f_{u, 4}\) 表示 \(u\) 被某一个儿子 \(v\) 染色(\(v\) 没有限制)的方案数。刚刚的贡献应该是 \(f_{v,4} + f_{v, 3}\)

对应对转移式进行了一通检查修改。

考试结束了,喜报,39.2。

精神放松下来,骤然感受到了属于 39.2 的力度。

水喝完了,嗓子痛,在大巴车上晕得睡不着。

据说 yr 切了两道,心又往下沉了一沉。

终于到家了,更加喜报,39.4,草草吃了点,去医院输液。

躺在病床,感觉身体越来越烫,仿佛整个人都要融化了,知道是在逼汗,不敢把铺盖掀开。

又抗了 1h+,方拨云见日。

回家终于可以摆烂了,晚上 24:30 睡了,15 号起来狂暴摆了一天。


有一些感慨想要抒发,但是这里位置太小,写不下。

\(1,2\) 都能过,但是卡死在点 \(3\) 了。

可能卡了 1h+,自闭了,剩下 30min+,赶紧滚去打 T1 暴力。


考试结束了,喜报,39.2。

精神放松下来,骤然感受到了属于 39.2 的力度。

水喝完了,嗓子痛,在大巴车上晕得睡不着。

据说 yr 切了两道,心又往下沉了一沉。

终于到家了,更加喜报,39.4,草草吃了点,去医院输液。

躺在病床,感觉身体越来越烫,仿佛整个人都要融化了,知道是在逼汗,不敢把铺盖掀开。

又抗了 1h+,方拨云见日。

回家终于可以摆烂了,晚上 24:30 睡了,15 号起来狂暴摆了一天。


有一些感慨想要抒发,但是这里位置太小,写不下。

明天继续。

upd:除了一些牢骚,那太软弱了,没啥可说的,不如不讲。


15 号晚上过来检查 T3 到底写错了啥,第一眼发现 std 状态只设了 4 个心想坏了,怕不是算重了。

思考了一番认为没有算重,开始仔细看题解。

发现事情很有转机,题解的状态和我的状态有如下对应:

  • \(F_{u, 0} = f_{u, 2}, F_{u, 1} = f_{u, 0}, F_{u, 2} + F_{u, 3} = f_{u, 1}, F_{u, 3} = f_{u, 3}, F_{u, 0} + F_{u, 2} = f_{u, 4}\)

那么,借此可以发现这样一个等式:\(f_{u, 1} + f_{u, 2} = f_{u, 3} + f_{u, 4}\),所以实际上我确实状态多设了一个,但是无伤大雅。

经过一步步对应,发现问题仅仅出在最简单的 \(f_{u, 3}\) 写错了,即 \(u\) 从始至终都没有被染色的情况。

本来最开始没有加入 \(f_{u, 4}\) 的时候写对了,写的是 \(\prod_{v\neq fath} (f_{v, 0} + f_{v, 2})\),但是加入这个状态过后,由于脑子发电,误认为 \(> fath\) 的边没有限制,改成了 \(\prod_{v < f}(f_{v, 0/2}) \prod_{v > f}(f_{v, 0/4})\)

当然,由于这个时候没有意识到还需要 inc(f[u][1], f[u][3]),居然给样例 1,2 撞对了,不好评价。

听说 T24 是水题,思考了一下秒了,傻波题...

看题解发现 T1 的正解要素都已经基本集齐,但当时就是没有串起来...

[USACO20DEC] Sleeping Cows P

考虑怎样可以算到一个方案。

考虑让每一个方案都被方案中最小的没有匹配的牛给计算到。

枚举牛 \(i\) 是方案中没有被匹配到的最小的牛,设 \(a\) 是第一个可以匹配的牛棚,现在有如下条件:

  • \(\ge a\) 的牛棚都被填满
  • \(i - 1\) 头牛都有匹配

关注第二个条件,这 \(i - 1\) 头牛要么匹配 \(< a\),要么匹配 \(\ge a\),且匹配 \(\ge a\) 的部分没有任何限制,确定了个数方案数就是阶乘。

进一步地,发现 \(> i\) 的牛只能匹配 \(\ge a\) 的部分。

事情已经很明了了,枚举 \((m - a + 1)\) 个牛棚中有 \(x\) 头是 \(i - 1\) 的部分解决的,那么剩余部分的数量都是固定的。

现在需要计算的是,牛 \([i + 1 \dots n]\) 匹配了 \(x\) 个棚的方案 和 棚 \([1 \dots a - 1]\) 匹配了 \(x\) 个牛的方案。

上述问题都可以在 \(O(n^2)\) 解决。

[CF1188C] Array Beauty

自然考虑计算 \(\ge v\) 的方案数

感知一下,算一算复杂度,发现结束了。

[USACO21DEC] Paired Up P

[USACO21DEC] Paired Up P :https://www.cnblogs.com/mk-oi/p/LuoguP7987.html 给出了另外一种精妙的解法

有一个相对怪异的做法是,硬上 \(f_{i, j, 0/1}\) 表示处理了前 \(i\) 个 H,\(j\) 个 G,上一个没有匹配的是 H/G

转移要么新点一个不匹配 \(f_{i, j, \star} \to f_{i + 1/0, j + 0/1, \star}\),要么可以匹配 \(f_{i,j,\star}\to f_{i+1,j+1,\star}\)

问题在于 \(0/1\) 之间的转移。

对于一个 H 而言,如果点他不匹配,处理出下一个可以被点为不匹配的位置 \(x\),有转移:\(f_{i, j, 0}\to f_{i + (x - j), x, 1}\),同时要求 "lcp" \([i + 1][j + 1]\) 大于等于对应长度。

一个担心是,由于有了 \(f_{i, j}\to f_{i + 1,j +1}\) 的转移,会不会不需要匹配这么多。

注意到 \(x - j\) 的值会随着 \(j + 1\) 而变小,知道刚好可以对应。

(总感觉这里这个对应不太自然)

10.16

上午把周末的总结收了尾,开始订正。

在订正的过程中,发现自己即使是已经明白了 T1 的做法,距离 AC 还有很长的距离。

越改越急,时间越长,越感觉自己菜波。感觉心态又给打回去了,我觉得纯 sb.


模拟赛,不小心打自闭了。啥都不想干。

10.17

处于一个想要摆烂,但是又觉得没啥好摆的,也知道不该摆烂,但就是不想做题的状态。

上午下午慢吞吞地做题,晚上听了一会儿开始有点犯困,在比较熟悉的部分睡了一会儿。

感觉自己的失败大概就是不够卷吧,既然这样,似乎也很公平。

认了?


学习了一下线段树历史版本和(有线段树维护矩阵的方法,以简化标记之间关系的思维难度)

[COCI2021-2022#2] Magneti

连续段 DP,之前做过类似的,大概是 2022HL集训 的某道题,钦定 </= 分段啥啥的。

找到了对于此类 DP 的一个 总结

10.18

摆烂了。

10.19

给自己放了个小假,但是本质就是矫情,脑残,没水平。

10.20

上午摸掉一半,似乎有点太放松了

晚上靠后的部分,随机了一些水题想着玩,涨了一点信心/hanx

CF1876D Lexichromatography

由于之前做过 A win/B win/Draw 的博弈题满足 Awin 的方案数和 Bwin 的方案数一致,所以这次想到了其实只需要计算 Draw 的方案数。

发现此时的条件异常的严苛。考虑每一种数值,发现必然是交替选择,方案数必然是 \(2\) 的次幂,在于第一个是选个谁。

还有一点限制,是说有些时刻必定是某一个人先拿,不存在先后选择的问题。

轻巧的,考虑当前的情况实际上是若干个二元组 \((l, r)\) 表示必须 A 选 l,然后直到 \(r\) 时刻 B 选 r 之前, B 不能再选其他的数。

实际上也就是 二元组之间不能出现包含,且可以发现如果二者有交,那么实际上二者第一个是谁会绑定。

于是,使用并查集将绑定的部分连结即可。

[loj3746]「COCI 2015.10」UZASTOPNI

简单思考,力图处理这个 DP 的转移顺序问题。

发现将儿子排序过后,一切好说。

[ARC066F]Contest with Drinks Hard

问题形如有 \(n^2\)\((l, r)\) 区间修改,求每一个位置的最大值。

高明的,采用分治的形式遍历这些对。这些贡献可以斜率优化。

[loj3451] 「USACO 2020.12 Platinum」Spaceship

大力 DP 并设辅助数组优化转移。

[ARC164F] Subtree Reversi

博弈题。

考虑偶层节点贡献是正的,奇层贡献是负的。

那么首先二者会都选偶层,然后选 选了之后不会解放偶层的 奇层。

到了必须要选的时候,由于选了一个奇层之后实际上可能连续白给,所以会选择白给最少的白给。

发生的操作是固定的。找个聪明的办法找到所有的贡献集合,二者一人选一个即可

10.21 CSPS2023

上午以调整状态为主(wyb 你真该死啊

下午 CSP,先花了可能 30min 把所有题都想了一遍,16:00 解决了 T12,17:00 解决了 T3,18:30 被 T4 干爆了。

T4 非常可惜,一来首先胡了一个傻波贪心,每次找到当前最急的一个并走到它(线段树维护每个点到当前已经走了的联通块的距离)

这个贪心显然非常傻波,首先的一个问题是如果两者一样急,应该咋走。

思考一下,发现会出错的原因是可能虽然某一个点不急,但是子树整体很急,所以应该往这边走,但是被导歪了。

那么看起来有点难办了,似乎需要 区间加法,动态维护子树 min。看起来就不太能做,然后华丽丽地否了。

注意到这个假做法可以过一些性质分,那么,姑且写个假做法,相信 ccf 的数据把!但是代码一直没写对,即使通过 assert 调出了 bug,但是已然浪费了巨量时间。

再想正解的时候已经为时已晚,G。

然而正解就是,令 \(lim_u = min_{v\in subtree_u} lim_v\),然后排序分配排列。

正确性很显然,假如没有树的限制,那么肯定是直接排序,通过取 min 操作,实际上满足了树的限制,那么大吉。

非常可惜,被傻波线段树限制了思维,发现需要做的操作没有一个可靠的 DS 可以维护就抛了,但是实际上根本不需要维护这个操作,直接排序就好了。

另一方面,也是因为最开始想题的时候没有将题目理化抽象成分配排列,痛失正解。


然后在口胡 CF,被 div2C 诈骗了很久。

posted @ 2024-02-29 21:45  _Famiglistimo  阅读(37)  评论(0编辑  收藏  举报