NOIP2024 模拟赛1

2023 赛年的结束,2024 赛年的开始。

我们会继续前行,也永远会。

如今走过这世间
万般流连
翻过岁月不同侧脸
措不及防闯入你的笑颜
我曾难自拔于世界之大
也沉溺于其中梦话
不得真假 不做挣扎 不惧笑话
我曾将青春翻涌成她
也曾指尖弹出盛夏
心之所动 且就随缘去吧
逆着光行走 任风吹雨打
短短的路走走停停
也有了几分的距离
不知抚摸的是故事 还是段心情
也许期待的不过是 与时间为敌

总结

100+100+95+100=395

总体感觉不难,主要还是今天运气比较好,第一感觉想到的结论都是对的,再加之第四题做过,也就比较正常了。

貌似考的还行,那就再接再厉吧,也算是对最近文化课有点爆炸的鼓励。

一个小小的失误在于 T3 猜出了结论,但是没有将情况讨论的足够清楚。

T2

规律还是好找的,只要你不嫌麻烦。

这题其实并不太难,主要还是想写一下具体数学证明。

首先我们考虑把经过 k 次的 bi,j 关于 a 数组的异或式子给展开。

比如 k=2b0,0=(a0,0a0,1a1,0a1,1)(a0,1a0,2a1,1a1,2)(a1,0a1,1a2,0a2,1)(a1,0a1,1a2,0a2,1)

我们考虑对于 b0,0,经过 n 次操作之后,这个展开式中,ai,j 会出现多少次。

我们可以把这个问题转化成一个路径上的问题:

对于一个点 (i,j),他有四个位置可以选择前往:

  • (i,j)

  • (i1,j)

  • (i,j1)

  • (i1,j1)

问你经过 n 步之后到达 (0,0) 的方案总数是多少。

显然我们可以发现一个问题,就是在这 n 步中,你需要选择 i 步减少第一维,j 步减少第二维。

而且,这两维是分别独立的,也就是说,你对于这 n 步,你如果确定了是哪 i 步减少第一维,哪 j 步减少第二维,那就可以对应一种方案。

所以,ai,j 经过 n 次操作之后,对于 b0,0 的贡献就是 Cni×Cnj

由于是异或,对于一个 ai,j,经过 n 次操作之后,要使其产生贡献,必然有 Cni×Cnj1(mod2)

我们考虑用 Lucas 定理将其展开。

然后发现,展开之后的每一个 C,他都必须是 1,故有 (i|j)n。(这里指的二进制)

那就好办了。

我们对于每一个 i,j,将 i|j 高维异或和一下即可得到答案。

T3

被抽上去讲这道题目。

首先我们先考虑一种比较特殊的情况:任意两个线段都没有包含关系。

我们考虑先在这种情况下算出答案。

不难想到将所有的线段根据 l 从小到大排序。显然,由于不存在包含关系,所以排完序之后有 i<j,li<lj,ri<rj

不难发现,对于选出了的 k 个集合中的任意一个集合 S,假设线段 i,jS,那么显然,线段 ij 的交集肯定是所有线段 k,k[i,j] 的交集。所以要让答案更优,我们显然希望在选择了 i,j 为同一个集合的情况下,把 k 全部放入这个集合,不仅不会影响这个集合,还有可能让其他集合的答案变大。

总结一下,就是,在排完序的情况下,分成的集合,要使其权值最优,必然是连续的线段。

所以就方便很多了,考虑 DP。(以后所有的操作必然)

定义 dpi,j 表示在将前 i 个分成 j 个集合所能产生的最大权值。

有:dpi,j=max{dpk,j1+val(k+1,i)},(k[0,i1])val(i,j) 表示 ij 这一堆线段中的交集大小。

由于我们排完序之后,l,r 均满足单调性,所以可以把 val(k+1,i) 写成 max{rk+1li,0}

于是,我们得到了在不含有包含线段之下, 复杂度 O(n2k) 的一个算法。

我们考虑先对这个算法进行优化,然后再迁移到有包含线段的情况。

首先,这个 max 看着很烦,我们考虑把这个 0 单独提出来。

0 的含义就是,选出的集合中,有至少一个集合的线段交集是 0

显然,这样的集合只能有一个,如果还有另一个,那我们显然可以将这两个合并。

并且,对于剩下的 k1 个集合,每个集合的大小显然是 1。如果不是,我们显然可以从这个集合中选出一个线段,插入到交集为 0 的集合中,然后使得这个集合得到更大的答案。

所以,对于有 0 的答案,就是将所有线段按照长度排序之后,选择最大的 m1 个加起来。

于是,我们就排除了这个 max 的干扰,转移式子变成 dpi,j=max{dpk,j1+rk+1li}

显然,对于每个 j1,我们可以维护一个 dpk,j1+rk+1 的最大值,使得转移复杂度优化到 O(nk)

然后,我们考虑怎么把有互相包含的线段给处理掉。

假设线段 a 包含线段 b。对于一个最优方案,假设 aSa,bSb

如果:

  • Sa=Sb,显然,我们可以考虑直接把 a 删掉,因为这个集合的交集根本就与 a 无关,只需要管 b

  • SaSb。可以证明,Sa=1。如果 Sa1,我们可以把线段 a 加入 b 这个二集合,使得 Sb 这个集合的答案不变,还有可能增大 Sb 的答案。故 Sa=1

其实对于第二种情况,我们还是可以把 a 删掉,最后求到 dpn,i 的时候,还可以选择 ki 个集合,把被删掉的长度最大的 ki 根线段分别放入一个集合,剩下的放入他包含的那个线段的集合,那么这个 i 的答案就是 dpn,i+sumki,最后对于每一个 i 的答案取最大值即可。

posted @   Saltyfish6  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
Document
点击右上角即可分享
微信分享提示