NOIP2024 模拟赛1
\(2023\) 赛年的结束,\(2024\) 赛年的开始。
我们会继续前行,也永远会。
如今走过这世间
万般流连
翻过岁月不同侧脸
措不及防闯入你的笑颜
我曾难自拔于世界之大
也沉溺于其中梦话
不得真假 不做挣扎 不惧笑话
我曾将青春翻涌成她
也曾指尖弹出盛夏
心之所动 且就随缘去吧
逆着光行走 任风吹雨打
短短的路走走停停
也有了几分的距离
不知抚摸的是故事 还是段心情
也许期待的不过是 与时间为敌
总结
\(100+100+95+100=395\)。
总体感觉不难,主要还是今天运气比较好,第一感觉想到的结论都是对的,再加之第四题做过,也就比较正常了。
貌似考的还行,那就再接再厉吧,也算是对最近文化课有点爆炸的鼓励。
一个小小的失误在于 T3 猜出了结论,但是没有将情况讨论的足够清楚。
T2
规律还是好找的,只要你不嫌麻烦。
这题其实并不太难,主要还是想写一下具体数学证明。
首先我们考虑把经过 \(k\) 次的 \(b_{i,j}\) 关于 \(a\) 数组的异或式子给展开。
比如 \(k=2\),\(b_{0,0}=(a_{0,0}\oplus a_{0,1}\oplus a_{1,0}\oplus a_{1,1}) \oplus (a_{0,1}\oplus a_{0,2}\oplus a_{1,1}\oplus a_{1,2}) \oplus (a_{1,0}\oplus a_{1,1}\oplus a_{2,0}\oplus a_{2,1}) \oplus (a_{1,0}\oplus a_{1,1}\oplus a_{2,0}\oplus a_{2,1})\)
我们考虑对于 \(b_{0,0}\),经过 \(n\) 次操作之后,这个展开式中,\(a_{i,j}\) 会出现多少次。
我们可以把这个问题转化成一个路径上的问题:
对于一个点 \((i,j)\),他有四个位置可以选择前往:
-
\((i,j)\)
-
\((i-1,j)\)
-
\((i,j-1)\)
-
\((i-1,j-1)\)
问你经过 \(n\) 步之后到达 \((0,0)\) 的方案总数是多少。
显然我们可以发现一个问题,就是在这 \(n\) 步中,你需要选择 \(i\) 步减少第一维,\(j\) 步减少第二维。
而且,这两维是分别独立的,也就是说,你对于这 \(n\) 步,你如果确定了是哪 \(i\) 步减少第一维,哪 \(j\) 步减少第二维,那就可以对应一种方案。
所以,\(a_{i,j}\) 经过 \(n\) 次操作之后,对于 \(b_{0,0}\) 的贡献就是 \(C_{n}^i\times C_{n}^j\)。
由于是异或,对于一个 \(a_{i,j}\),经过 \(n\) 次操作之后,要使其产生贡献,必然有 \(C_{n}^i\times C_{n}^j \equiv 1 \pmod 2\)
我们考虑用 \(\texttt{Lucas}\) 定理将其展开。
然后发现,展开之后的每一个 \(C\),他都必须是 \(1\),故有 \((i|j)\in n\)。(这里指的二进制)
那就好办了。
我们对于每一个 \(i,j\),将 \(i|j\) 高维异或和一下即可得到答案。
T3
被抽上去讲这道题目。
首先我们先考虑一种比较特殊的情况:任意两个线段都没有包含关系。
我们考虑先在这种情况下算出答案。
不难想到将所有的线段根据 \(l\) 从小到大排序。显然,由于不存在包含关系,所以排完序之后有 \(\forall i<j,l_i<l_j,r_i<r_j\)。
不难发现,对于选出了的 \(k\) 个集合中的任意一个集合 \(S\),假设线段 \(i,j\in S\),那么显然,线段 \(i\) 和 \(j\) 的交集肯定是所有线段 \(k,k\in[i,j]\) 的交集。所以要让答案更优,我们显然希望在选择了 \(i,j\) 为同一个集合的情况下,把 \(k\) 全部放入这个集合,不仅不会影响这个集合,还有可能让其他集合的答案变大。
总结一下,就是,在排完序的情况下,分成的集合,要使其权值最优,必然是连续的线段。
所以就方便很多了,考虑 \(\texttt{DP}\)。(以后所有的操作必然)
定义 \(dp_{i,j}\) 表示在将前 \(i\) 个分成 \(j\) 个集合所能产生的最大权值。
有:\(dp_{i,j}=\max\{dp_{k,j-1}+\text{val}(k+1,i)\},(k\in [0,i-1])\),\(\text{val}(i,j)\) 表示 \(i\) 到 \(j\) 这一堆线段中的交集大小。
由于我们排完序之后,\(l,r\) 均满足单调性,所以可以把 \(\text{val}(k+1,i)\) 写成 \(\max\{r_{k+1}-l_i,0\}\)。
于是,我们得到了在不含有包含线段之下, 复杂度 \(\mathcal{O}(n^2k)\) 的一个算法。
我们考虑先对这个算法进行优化,然后再迁移到有包含线段的情况。
首先,这个 \(\max\) 看着很烦,我们考虑把这个 \(0\) 单独提出来。
\(0\) 的含义就是,选出的集合中,有至少一个集合的线段交集是 \(0\)。
显然,这样的集合只能有一个,如果还有另一个,那我们显然可以将这两个合并。
并且,对于剩下的 \(k-1\) 个集合,每个集合的大小显然是 \(1\)。如果不是,我们显然可以从这个集合中选出一个线段,插入到交集为 \(0\) 的集合中,然后使得这个集合得到更大的答案。
所以,对于有 \(0\) 的答案,就是将所有线段按照长度排序之后,选择最大的 \(m-1\) 个加起来。
于是,我们就排除了这个 \(\max\) 的干扰,转移式子变成 \(dp_{i,j}=\max\{dp_{k,j-1}+r_{k+1}-l_i\}\)
显然,对于每个 \(j-1\),我们可以维护一个 \(dp_{k,j-1}+r_{k+1}\) 的最大值,使得转移复杂度优化到 \(\mathcal{O}(nk)\)。
然后,我们考虑怎么把有互相包含的线段给处理掉。
假设线段 \(a\) 包含线段 \(b\)。对于一个最优方案,假设 \(a\in S_a,b\in S_b\)。
如果:
-
\(S_a=S_b\),显然,我们可以考虑直接把 \(a\) 删掉,因为这个集合的交集根本就与 \(a\) 无关,只需要管 \(b\)。
-
\(S_a\not= S_b\)。可以证明,\(S_a=1\)。如果 \(S_a\not=1\),我们可以把线段 \(a\) 加入 \(b\) 这个二集合,使得 \(S_b\) 这个集合的答案不变,还有可能增大 \(S_b\) 的答案。故 \(S_a=1\)。
其实对于第二种情况,我们还是可以把 \(a\) 删掉,最后求到 \(dp_{n,i}\) 的时候,还可以选择 \(k-i\) 个集合,把被删掉的长度最大的 \(k-i\) 根线段分别放入一个集合,剩下的放入他包含的那个线段的集合,那么这个 \(i\) 的答案就是 \(dp_{n,i}+sum_{k-i}\),最后对于每一个 \(i\) 的答案取最大值即可。