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