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\) 的答案取最大值即可。

posted @ 2024-03-09 15:53  Saltyfish6  阅读(49)  评论(0编辑  收藏  举报
Document