集训9做题记录(下)

CF1903D2 Maximum And Queries (hard version)

简单版直接贪心,发现高位到低位贪是对的。

怎么优化呢?首先一位没有,然后搞出来,那么它在后面全是 \(0\),贡献易于计算。

这一位会有多少个这种变化呢?看看限制,就是这一位强制为 \(0\),并且是当前 \(ans\) 的超集,设 \(f_{i,s}\) 表示第 \(i\) 位为 \(0\) 的状态 \(s\) 的超集。

这个很好维护,直接高维前缀和,每次贪心所有数只有三种,我们称这个数第一次有某一位由 \(0\) 变 \(1\) 为“操作”。

那么只有操作前,在这次操作,操作过三种情况,操作前的这次不产生贡献,操作后的也不会,只有在这次操作的特殊。

如何计算呢?我们要维护一个 \(g_{i,s}\),方式同 \(f\),只不过 \(g\) 存的是低位和而 \(f\) 是方案数,贡献为 \(2^p \times f_{p,ans} - g_{p,ans}\)。

最后就是一些细节,操作后的记 \(cnt\),每一位成功贪心就 \(cnt += f_{p,ans}\)。

如果最后答案大于 \(1e6\) 就特判一下,因为我们没处理那么多位,这个情况好做因为每个 \(a_i\) 均增加,拉齐即可。

CF1917E Construct Matrix

读错题空悲切了,但是确实好题有趣味。

首先发现 \(k\) 是奇数包无解的,这个很显然。

然后就是 \(k mod 4 = 0\) 的情况非常简单,直接每次把 \(2 \times 2\) 的区域搞成 \(1\),重复即可。

接下来就只剩 \(k mod 4 = 2\) 的了,看看哪个结构能够抵消,如果不能抵消合法的情况就很少了。

这个有一种,我绝对在某个题里见过,就是:

1 1 0 0

1 0 1 0

0 1 1 0

0 0 0 0

发现这个要和上面情况兼容必须补 \(0\),也就是产生 \(10\) 个 \(0\),那么现在会了 \(6 \le k \le n^2 - 10\) 的情况了。

剩下 \(k = 2\),发现 \(n \ne 2\) 绝对无解,\(n = 2\) 特判,\(k = n ^ 2 - 2\) 同理。

最后只有 \(k = n ^ 2 - 6\),这个实在无颜继续抄袭题解了,所以自己想一下,发现上面那种情况逆向思维一下全局取反,赢了。

顺便说一下题解的构造方法,虽然没有我的优美但是也很好。

1 1 0 0

1 0 1 0

1 1 1 1

1 0 0 1

你可以看到本质相同的。

抵消的方式也还有一种,这里记下来:

0 1 1 0

1 1 0 0

1 0 1 0

0 0 0 0

往里面塞 \(2 \times 2\) 照样好做:

0 1 1 0

1 1 0 0

1 1 1 1

0 1 0 1

CF1917F Construct Tree

写一点思路,还没看题解。

首先要凑出来这个直径用的肯定是背包,方案也好做。

但是可能有多种选取方式,用大的还是用小的?用大的肯定有一些好处,如果选取的一段是后缀,那么直接赢了。

是后缀又不太可能,发现限制条件只要剩下的那个小于直径的任意一半就可以了,所以最后的图实际是链套菊花。

假设直到直径然后分配到两半肯定让它们尽量相近,这个贪心可以吗?不可以,但是上dp也能做。

一个方案可以用 \(n^2\) 的复杂度来check,所以只要找到一个绝对不劣的方案就赢了,优先取大的似乎充满了道理。

我想到一个二分,二分有一个后缀必须取,这不对,没有道理。

现在关键难点在于dp同时影响两个东西,两半的划分和剩余的最大值,我是否要先贪心写一下?

写完WAontest3,被hack了,准备看题解。

首先设最大值为 \(mx\),如果 \(mx + cmx > d\) 绝对无解。

然后就是链上包含 \(mx\) 的情况,那么只要能凑出来就赢了,这个有上一条约束就一定是真的,因为 \(d - mx >= cmx\)。

\(\frac{nd}{w}\) 的 dp 可做。

\(mx\) 不在链上就需要两截都大于等于 \(mx\),这个难以刻画,发现可以加维,因为 \(\frac{nd^2}{w}\) 比较小,所以直接开两维记两段长度就可以了。

最难的就是把这几种情况列出来,对着 \(mx\) 考虑就很好。

CF1918F Caterpillar on a Tree

我想的是长链剖分,具体就是长剖完之后拿出长链,然后长链要 \(\ge\) 根到 \(fa_{top}\) 的距离。

直接贪,准备看看题解验证一下。

对了但是没有完全对,树链剖分还是比较抽象的,这里直接对每个点作为子树根考虑,显然是一个子树跑完跳上去一下。

设子树内最深的点为 \(p\),那么原本要走 \(dep_p - dep_i + 1\),现在要走 \(dep_p - 1\),答案减少 \(max(0 , dep_p - 2dep_i + 2)\)。

对这个值排序就可以了,贪心取,有几个细节。

首先就是不能重复选择 \(p\) 开一个 \(vis\) 记一下即可。

然后,发现可以不用返回根,给 \(k + 1\),相当于多跳了一次强制回到根。

答案的基准为 \(2n - 2\),在这个基础上往下减就行。

这也太困难了真是青题吗???

CF1951F Inversion Composition

一眼不可做,排列还能乘?

研究了这个乘法,发现 \(1,2,3...n\) 是单位元,\(n,n-1,n-2...1\),这个逆元是它本身,别的都有一个与之对应的逆元。

并不懂这个和逆序对的关系,先考虑 \(1,2\) 两个数的贡献。

假设在排列 \(q\) 里找到两个位置 \(a\) 和 \(b\),\(q_a = 1,q_b = 2\),那么 \(1\) 在 \(i\) 上当 \(p_i = a\),同理设 \(j\),所以贡献是 \([b > a] + [pos_b > pos_a]\)。

如果这对在 \(p\) 里是逆序那么两个固定贡献 \(1\),这两个条件必有一个成立,否则就是在 \(p\) 里逆序就贡献 \(2\),求逆序对使用树状数组。

剩下的正负,奇偶性应该就可以判无解了。

样例的有无解全判对了。

剩下就是一些对不贡献然后给构造,\(p\) 是单位元我会吗?发现是否可以at_dp_t的类似手法只不过是贪心?发现太好搞了能拉满就拉满,否则一下定好。

发现直接填最小,产生的贡献好做,所以前一段直接全递减,减到一个位置发现暴力扫前面哪些位置能填也行了,后面递增,是否做完?写一发吧。

好的全假了那个性质都是错的看看能不能改正一下。

我咋感觉换成逆元就对了,起码过了样例1。

切了,一个题测5分钟,上午刚P完说一个都切不了下午就切了一个紫。

这个性质就是假设 \(p\) 为 \(2,3,1\),那么设 \(q\) 为 \(x,-,y\)(对于 \(x,y\) 考虑),那么 \(w\) 一定是 \(-,y,x\),发现 \(y\) 和 \(x\) 反过来,所以逆序对固定为 \(1\)。

进一步思考为什么,因为 \(1\) 在 \(2\) 的后面,这个是 \(p\) 的一个逆序对,我们求 \(p\) 的逆元称为 \(s\),发现 \(s = 3,1,2\),\((3,1)\) 是逆序对。

用实际意义理解就是在 \(p\) 中 \(3\) 的位置在 \(1\) 的位置之前,这个就可以刻画出性质了。

另外发现如果原排列两个位置逆序那么逆排列中也会有与之对应的逆序对,所以两个互为逆元的排列逆序对数相同。

这个性质也很有意思。

看了题解发现和我的做法一样,这种题面吓唬人的题实际不咋难。

CF1956E2 Nene vs. Monsters (Hard Version)

0个思路。

看题解发现了很牛的性质,假设进行了 \(n\) 次,\(p\) 位置还在,那么 \(p + 1\) 会受到 \(n\) 量级的伤害。

同理,\(p + 2\) 会受到 \(n^2\) 量级的伤害,\(p + 3\) 会受到 \(n ^ 3\) 量级的伤害,所以进行 \(^3\sqrt V\) 量级的操作,就最多只有 \(3\) 的连续段了。

所以我们重复操作直到没有 \(4\) 的连续段,然后剩下还有一些零散的小段,直接使用等差数列求和随便判了。

最后就是一个细节,在 \(n,1,2\) 这三位里造成的伤害要额外多 \(a_1\),因为 \(1\) 先打。

所以这个题就是动用惊人观察力观察出这个三次根号,阴飞了。

CF1976E Splittable Permutations

感觉 \(q = 1\) 是重要的,首先 \(n\) 和 \(n - 1\) 输出 \(\frac{n!}{2}\)。

发现输出的其实是 \((r - l)!A_n^{l-1}\)。

然后就想到了有一些位置是固定的,可以图论建模开一棵树,然后前序遍历就是实际顺序。

那么没在 \(l,r\) 出现的数怎么办?我不会了,看书!我是区!

建树是对的,为了方便表示我们将出现在 \(l,r\) 中的数称为固定值。

一个非固定值 \(a\) 插在两个固定值 \(x,y\) 之间,需要 \(a < max(x , y)\),为何呢?因为 \(x,y\) 要分开,中间有一个更大值必然要单开一段。

但是 \(x,y\) 所属的段还是相邻的,这种情况肯定不行,所以我们可以计算相邻的 \(max(x,y)\),丢到桶里做后缀和。

发现不能直接这么干,为什么呢,假设 \(a = 5,x = 4,y = 6\),也就是 \(4,6 \Rightarrow 4,5,6\),那么 \(max\) 集合变化情况为 \({6} \Rightarrow {5,6}\)。

还有影响,而且你只记录了 \(max\) 而不知道 \(cmax\),这样新增的就不知道是什么了,发现新增的至少为 \(a\)。

这就有办法了,反着扫值域,非固定值处 \(sum\) 一定会 \(+1\)。

所以为什么我连这种题都切不了?

?!区区!?

CF1983F array-value

我承认我切不了青题。

这题将会改变我的大脑结构。

发现 xor 非常困难,这个时候就几个做法,Trie or 拆位。

先别急,发现要求第 \(k\) 小太困难了,你不可能把前 \(k\) 个都列出来,这样复杂度都爆int了。

所以考虑转化为计数问题,进行二分。

现在问题转化为了求价值小于等于 \(mid\) 的子串个数,发现是子串,直接扫描线,只不过不上线段树了上Trie。

具体地,维护一个 \(pos\),表示当前右端点能取到的最右侧的左端点。

每次直接在trie上查询,经典的单侧查询,要维护 \(maxid\) 表示子树内最大的下标。

这个trick参考P17170 未来,致敬传奇__lg,异或就这么处理。

所以做完了。

AT_arc167_c [ARC167C] MST on Line++

你知道吗?青 < 紫,天天被青题打败然后打败紫题。

对 \(a\) 排序。

最小生成树很恶心,于是我想了 \(k\) 大的情况,这个就是对 \(1\) 连菊花,轻松绷住,发现每个数都尽量连向更小值最优。

所以我们钦定 \(1\) 为根两边往 \(1\) 连,但是疑问来了就是不会先往外再往里吗?一定不会,神奇吧。

首先你往外连肯定还要连回来要么图不连通,那么假设你连了一个更小的,它回来连,连向比当前值大的其实等价当前直接连那个。

连向小的同理也不会更优,如果把当前值连向外侧更大的也是相似,所以都不存在,那么就是这个值在靠近 \(1\) 一侧的 \(k\) 范围内连最小的。

首先就是含有 \(1\),为什么特殊考虑呢?因为只有这种情况会放不满 \(k\) 那么大的区间。

设当前数是 \(i\),贡献为 \(\Sigma 2 \times (n - d) \times(n - 2)! \times a_i\)

那么不含 \(1\) 呢?设值 \(i\) 内侧最小值为 \(j\),不小于 \(j\) 且不是 \(i\) 的个数记为 \(sum\)。

那么首先这个区间的方案数容斥一下 \(A_{sum}^k - A_{sum - 1}^k\) 记为 \(cnt\)。

剩下的就是把这个区间看成一个值,乘上全排列,最后乘上权值,区间的方向根据 \(1\) 决定,不重不漏。

贡献为 \(cnt \times (n - k)! \times max(a_i , a_j)\)。

做完了时间复杂度 \(O(n^2)\)。

AT_arc170_c [ARC170C] Prefix Mex Sequence

看了题直呼何意味,这不是【模板】快速幂吗?对于一个位置是 \(1\) 填的是固定的。

不是 \(1\) 只要不填 \(mex\) 即可所以是 \(m\) 种,设 \(1\) 的个数为 \(cnt\),答案为 \(m^{cnt}\),样例过了。

虽然我马上给自己hack了但是还是交一下,过了很多。

发现只有在 \(m < n\) 时,才有可能不是这个,\(mex\) 会冒出来变为 \(m + 1\),这个时候碰到 \(1\) 无解,碰到 \(0\) 则会有 \(m + 1\) 个情况。

考虑dp,设 \(dp_{i,j}\) 为考虑到前 \(i\) 位出现了 \(j\) 个不同的数的方案数,不需要知道是什么,因为上述情况都是在所有数全有的时候发生的。

如果为 \(1\) 直接取 \(mex\),\(dp_{i,j} = dp_{i - 1 , j - 1}\)。

为 \(0\) 就是那两种,\(dp_{i,j} = dp_{i - 1,j - 1} \times (m - (j - 1)) + dp_{i - 1,j} \times j\)。

最后输出 \(\Sigma dp_{n,i}\) 即可。

发现这样的复杂度是 \(O(nm)\) 的,看似过不了,但是你考虑 \(m > n\) 就直接数据点分治了,所以上界还是 \(O(n^2)\)。

posted @ 2026-11-03 11:37  wzc6666  阅读(4)  评论(1)    收藏  举报