这里只放题解,不放题面&代码
所以大家赶紧去给正睿氪金啊 然后享受氪金被虐的快感
A
分类讨论题
首先选包含的区间并没有什么*用,于是可以按照套路把区间的右端点排个序,设\(dp[i]\)表示选第\(i\)个区间的最大答案
设区间\(j(j<i)\)为\([l_j,r_j]\),考虑从\(dp[j]\)更新到\(dp[i]\)
\(r_j<l_j\)
直接更新即可
\(l_j<l_i,r_j\leq r_i\),\(i,j\)同色
给\((r_j,r_i]\)加上\(x\)的贡献
\(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\)