CF745

A:打表,发现时n!/2,证明的话可以观察到具有自反性

B:垃圾,发现一条链和菊花图分别是极端数据,搞搞就完了

C:双指针,枚举两行,中间单调性

D:考虑一个数什么时候被称为段的最大值,当且仅当他为最大时

设f[i][j]表示当前枚举到1-i的排列,有j个最大值的方案数

然后再设一维k,表示有了k个好数,枚举左区间有多少个好数

这个题跟地精部落很像,还是dp做太少了

不要关心这个题的状态设计,认真你就输了

 

F:这个题看懂了之后好简单,我描述可能会复杂,引用一下转转给我讲的

这道题让你选择 m 个关键点,然后答案是 sum 关键点 * m - sum 区间

我们就枚举相邻两关键点间的 a[i] 最小值,记为 b[i] (i=1..m-1)

那么假设 b 序列最小的数是 b[pos] ,那么它对所有区间的贡献就是 pos * (m+1-pos)

因此,我们做这道题的时候,就考虑枚举一个数 a[x] 表示它是这个 b[pos]

那么它的贡献就是左关键点数 * 右关键点数

枚举 a[x] 的过程相当于就是在笛卡尔树(小的为根)上做背包合并

dp[u][i] 表示考虑了 u 子树,里面选择了 i 个关键点的最小答案

我们挑最优的关键点嘛,所以是 dp 的时候计算出来的

当前子树的根是 u ,它两个儿子是 ls 和 rs ,那么比如你可以 dp[u][i+j] <- dp[ls][i] + dp[rs][j] - 2*i*j*a[u]

有个贪心做法 https://codeforces.com/contest/1580/submission/130370294

 

posted @ 2021-09-30 21:34  maruize  阅读(100)  评论(0)    收藏  举报