『省选模拟赛1』 Day5 总结

前言

落日沉溺于橘色的海,晚风沦陷于赤诚的爱。

省流:省选集训,BZ 13 人,50+20+0=70rk 11,因为有两个跟我并列倒一,真的糖丸了,低年级的也考不过。

T1 不会用 Bitset 查询最低位的 1,即便不会,O(n3×log(n2)ω) 的极小常数二分做法也是可以通过的,但是我实现不够精细,导致暴力分都不如。

T2 分界点,我以为这个结论是错的,可能有些是第一种转移,有些是第二种转移,然后就否掉了。

T3 文件名打错了,TicketsTicket 不知道是哪个唐氏出题人这么拼单词的。

真,糖丸了。

T1

不会使用 Bitset 以及实现不够精细,太菜啦。

首先显然有一个 O(n3) 的区间 DP,即定义 dpl,r 表示删空这个子区间所需要的最小代价。

转移分为两种:

  • dpl,r=max{dpl+1,r1,cost(l,r)}
  • dpl,r=mink=l+1r1max{dpl,k,dpk+1,r}

实现常数足够小的话,应该可以除以一个 4,能够惊险得到 7080 的暴力分,而我多此一举的 Bitset 优化二分只有 50,没救了。

考虑如何优化。

其实首先有一种,即从小到大枚举边权,每加入一条边看这条边可以扩展到多少 DP 值。

不过我们考虑另一种,即二分答案,然后将 dpl,r 的定义转化为当前的边能否删空 [l,r] 这个子区间。

考虑使用 Bitset 算贡献进行转移,应该单次 Check 可以做到 O(n3ω)

总时间复杂度 O(n3×log(n2)ω),常数特别小可以通过。

Code

T2

告诉我们想到了什么奇葩结论就要敢于认为它是对的并去验证。

仍然先考虑暴力 DP。

首先,对于一堆 (ai,bi),显然是按照 bi 从大到小排序然后按照顺序选是最优的。

所以我们先按照 bi 从大到小排序。

然后考虑定义 dpi,j 表示前 i 个,选择 j 个,可以得到的最小 i=1kaci+bci×(i1) 的值。

转移很简单:dpi,j=min{dpi1,j,dpi1,j1+ai+bi×(j1)}

时间复杂度 O(n2),可以通过滚动或者类似背包的转移顺序做到空间复杂度 O(n),从而拿到前面 n104 这一档分。

考虑如何对这个转移式子进行优化。

通过打表发现,对于每个 i 可以找到一个分界点 k,使得 j[0,k],dpi,j=dpi1,j,j[k+1,i],dpi,j=dpi1,j1+ai+bi×(j1)

简单来说,就是每一个 i 所对应的所有的 j 的转移,前面一半是直接继承 i1,后面一半是直接把 i 加入进来。

故可以考虑使用平衡树优化 DP 来优化这个过程。

具体的,对于每个 i,在转移之前先通过二分找到分界点 k,然后将 k 这个点复制一份插在 k 后面,可以发现 k 后面的点会向后顺延从而下标对齐。紧接着,从复制点开始一直到最后一个点,其实本质上他们的增量数组是一个等差数列,这个应该可以通过一个普通的数据结构上的延迟标记来实现。

由于我太菜了,不会打平衡树,所以补题的时候用的块状链表来替代。

平衡树复杂度 O(nlog2n),块状链表复杂度 O(n×n×logn),实现精细的话单点查询可以做到 O(1),从而总时间复杂度降为 O(n×n)

听说有平衡树上二分的单 log 做法吗可惜我不会。

Code

T3

题解里面一堆这个题的相关结论,到时候再来看看。

稍微简单记一下吧,真要写起来还是太多了。

首先你最开始看上去只会 2m 的搜索,即去对这个区间爆搜是翻转还是不翻转。

我们需要一个有前景的多项式做法。

考虑对于方案进行观察来找出一些限制。以下皆称翻转区间的方案集合为 S

Claim 0

首先有一个为了方便叙述的东西要写在前面。

假设最终答案为 ans,那么对于 ansans,这样的 ans' 是一定存在对应的方案的。(当然前提是你最大能凑的出来。)

证明感性理解,从 ans 中可以直接通过调整得到,主要是为了后面二分答案的正确性。

Claim 1

对于任意一个答案最优的翻转集合 S,必然不存在 [a1,b1],[a2,b2]S,且这两个区间不相交。

考虑反证,如果有一个集合 S 能够找到两个不相交的区间 [a1,b1],[a2,b2],它显然不是最优的。

可以发现,如果我们不翻转这两个区间,会对答案造成一下变化:

  • i[a1,b1]i[a2,b2],显然 i 的被覆盖的次数在翻转之后是不会变的。
  • i[a1,b1]i[a2,b2],显然 i 的被覆盖次数会减少 2

可以发现这样的调整是不劣的,故上述性质是成立的。

Algorithm 1

其实我们已经可以通过上面的结论推出第一个多项式复杂度的算法。

先给出一些定义:

  • pi 表示点 i 在翻转了 S 内的区间之后,被覆盖的次数。
  • qi 表示在 S 被翻转之前,i 被覆盖的次数。(这东西在区间输入完之后是一个定值。)
  • ri 表示 i 号点在 S 内部的区间中,翻转前被覆盖的次数,形式化的:ri=[a,b]S[i[a,b]]
  • I 表示 S 内所有区间的点的交集。(已经证明过必然存在交集。)

对于每个 S,其对应的答案显然是 maxpi

可以发现,对于每一种方案 S,其实 pi,qi,ri 是存在等量关系的:pi=qiri+(|S|ri)=qi+|S|2×ri

对于 iI,其实也是存在等量关系的:ri=|S|

为了去得到跟答案相关的 pi,直观的想法是枚举一个点 s 满足 sI,然后为了得到 |S|,再去枚举 rs

我们发现,此时 i[1,n],|S|,qi 是确定的,为了得到 pi,我们还需要知道 ri,也就涉及到了我们对于 S 如何分配区间的问题。

不可能暴力去搜索,所以我们考虑二分答案 mid(在结论 0 中已经证明过一定能找出解,二分答案是正确的),显然只要满足 i[1,n],midpi,那么该答案就是合法的。

我们要做的就是通过控制 ri 去满足上面的条件。

观察到 ri=qi+|S|pi2=qi+rspi2,由于我们要让 pimid,所以有 riqi+rsmid2。我们要做的仅仅只是去让 ri 达到这个下限。

于是有一个比较直观的贪心,考虑从 1s 依次枚举点,如果当前的 ri 没有到达下限,那就找到当前可以使用的区间 [a,b] 中,b 最大的那个加入 S 中。(当然你最后还是要满足加入的区间是枚举的 |S|=rs 这么多个的)

最后看 i[s+1,n] 的点的 ri 是否满足要求即可。

此时时间复杂度 O(n2×m×logV×logm)

可以发现,一个很需要优化的空间在于,我们浪费了很多时间去枚举 s,rs,而我们本质上只需要找到一组合法的解即可,这样是否显得有些冗余呢?

Claim 2

对于最优的 S,其一定满足 midmaxi[1,n]pimaxiIpimaxi[1,n]pi1。用人话说就是在 I 中的点他们的被覆盖次数的最大值和最终的 maxpi 最多只会差 1

我们仍然还是去考虑不符合条件的 S,对其进行调整,即当前 maxiIpi<maxi[1,n]pi1 时一直执行以下两种操作。

  • 如果存在一个区间 [a,b]S 且其对应的点集 [a,b]=I,那么直接删掉 [a,b],可以发现对于 iI,pi=pi+1,iI,pi=pi1,差距在减小。
  • 否则假设 I 中的点对应的是区间 [l,r],考虑在 S 中找到 [l,b1],[a1,r] 这两个区间(可以发现这两个区间至少会分别在 S 中存在一个),把他们删掉,此时,iI,pi=pi+2,剩下的 pi 再怎么也是在减小,所以差距仍然在减小。

可以发现终止条件要么是 S 符合条件,要么是 S=

Algorithm 2

回顾一下第一个算法,我们是去枚举的 s,rs

我们定义的 sI,为了契合我们刚刚的结论,考虑把这个 s 的枚举加强为 Ips 最大的点,本质上不会造成什么影响。

由于 midpsmaxpi1,而由于结论 0,我们把 maxpi 从他原来的值提升到 mid 也是有解的,故我们只需要考虑 midpsmid1 的情况,此时 ps=qs+|S|2×rs=qsrs,所以相应的,rs 对应的值也就只有 qsmid+{0,1},也就是说,我们把刚才枚举 rs 的那层循环精确到了 O(1) 级别。

此时时间复杂度 O(n2×logV×logm)

那我们可不可以试图去优化 s 的枚举呢?

Claim 3

对于最优的 S,如果 S,其中一定存在一个,满足 sI,qs=maxi[1,n]qi。也就是说,输入之后被覆盖的最多的点的其中一个,一定会存在于某个最优的 S 所对应的 I 中。

其实,这个 s 不仅取到了 q 的最大值,他还是 Ip 最大的节点。

我们从 p 最大的点 s 来说明 s 也取到了 q 的最大值。

首先有 ps=qsrs(这个刚刚在算法二算过一遍了),而 psmaxpi1 故有 qs rsmaxpi1=max(qi+|S|2×ri)1=max(qi+rs2×ri1)

由于 iI,rirs1,故有 qsrsmax(qirs+[iI])1

此时,qsmax(qi+[iI])1。故 qs=maxqi,从而得证。

Claim 4

对于最优的 S,如果 S,那么一定存在一个 S,满足所有的 {s|qs=maxqi}I

我们有了正向的从 I 中选择其中 q 最大的一个必然会存在于最优方案中,那么是不是任意一个最大的都在最优方案中呢?

对于任意的 s,qs=maxqi,有 ps=qs+|S|2×rsansqs|S|+1。(根据性质二可得。)

故根据后面的不等关系, 2×|S|2×rs+1,由于 |S|rs,故这里只能取 |S|=rs

于是证毕。

Algorithm 3

由于已经证明了 qs 最大在最优的 I 中的任意性,也就是说,我们只需要枚举 qs 最大的点中的任意一个,然后再枚举 rs,而 rs 只有两种可能的取值。

时间复杂度来到 O(n×logm×logV),终于是可以通过了。

Code

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