ZROI2020省选失恋测Day4

这里只放题解,不放题面&代码

所以大家赶紧去给正睿氪金啊 然后享受氪金被虐的快感

A

分类讨论题

首先选包含的区间并没有什么*用,于是可以按照套路把区间的右端点排个序,设\(dp[i]\)表示选第\(i\)个区间的最大答案

设区间\(j(j<i)\)\([l_j,r_j]\),考虑从\(dp[j]\)更新到\(dp[i]\)

  1. \(r_j<l_j\)

    直接更新即可

  2. \(l_j<l_i,r_j\leq r_i\)\(i,j\)同色

    \((r_j,r_i]\)加上\(x\)的贡献

  3. \(l_j<l_i,r_j\leq r_i\)\(i,j\)异色

    \((r_j,r_i]\)加上\(x\)的贡献,给\([l_i,r_j]\)减去\(x+y\)的贡献

线段树维护一下即可

B

咕咕咕

C

注意到一件事:\(k\geq f(i,j)\geq f(i,j+1)\),原因请自行结合\(f\)的定义理解

然后有了这个东西,我们可以设计dp状态:\(dp[i][s][x]\)表示从第\(i\)\(s\)点集的点出发,删\(x\)个点最早不能到达的层数, 怎么想到的喂 从高层往低层dp

考虑你在这层删不删点:

不删就是\(dp[i][s][x]=min(dp[i][s][x],dp[i+1][to[s]][x])\),其中\(to[s]\)表示\(s\)点集能到达的第\(i+1\)层的点的点集

删的话讲道理你要枚举子集,然后\(3^k\)妥妥爆炸

但是你发现随着\(x\)的增大,\(s\)是在减小的。于是从小到大枚举\(x\)进行更新,然后枚举删掉\(x\)中的哪个点。有\(dp[i][s][x]=min(dp[i][s][x],dp[i][s/y][x-1])(y\in s)\)

边界条件是\(dp[i][s][x]=n+1\;(x<count(s)),dp[i][s][x]=i\;(x\leq count(s))\),其中\(count(s)\)表示\(s\)里有多少个\(1\)

最后统计答案就是\(\sum(dp[i][U][x]-dp[i][U][x])*x\),其中\(U\)为全集,为了方便\(dp[i][U][x]\)要和\(i+1\)\(max\)

猜你喜欢

转载自www.cnblogs.com/PsychicBoom/p/12185550.html