link。

值域分治优化决策单调性 DP 的 trick。朴素做法 trivial,不赘述。

考虑求取一个区间 \([l,r]\) 的 DP 值。先搞定在 \(m=\lfloor\frac{l+r}{2}\rfloor\) 的 DP 最优决策点,由于决策的单调性,\([l,m)\) 和 \((m,r]\) 的最优决策点就在 \([l',m']\) 和 \([m',r']\)(\('\) 系列变量代表最优决策点)。

于是值域分治解决。

#include <bits/stdc++.h>
template <class T> inline void chmax(T& a, const T b) { a = a > b ? a : b; }
template <class T> inline void chmin(T& a, const T b) { a = a < b ? a : b; }
inline long long rd() {
long long x = 0; bool f = 0; char ch = getchar();
while (ch < '0' || ch > '9') f |= (ch == '-'), ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + (ch & 15), ch = getchar();
return f ? -x : x;
}
template <class T>
constexpr T kInf = std::numeric_limits<T>::max();
int n, k, a[100100]; long long dp[100100][30];
namespace sm {
long long Res = 0; int app[100100], L = 1, R;
inline long long res() { return Res; }
inline long long cal(int x) { return 1ll * x * (x - 1) / 2; }
void prog(int l, int r) {
auto upd = [&](int p, int d) -> void {
Res -= cal(app[a[p]]);
app[a[p]] += d;
Res += cal(app[a[p]]);
};
while (L > l) upd(--L, 1);
while (R < r) upd(++R, 1);
while (L < l) upd(L++, -1);
while (R > r) upd(R--, -1);
}
} // namespace Sweepline Mo
void Rawgrass(int l, int r, int lg, int rg, int K) {
if (l > r) return;
int mid = (l + r) >> 1, pos = 0, rrg = std::min(rg, mid - 1);
dp[mid][K] = kInf<long long>;
for (int t = lg; t <= rrg; ++t) {
sm::prog(t + 1, mid);
if (dp[t][K - 1] != kInf<long long> && dp[mid][K] > dp[t][K - 1] + sm::res())
dp[mid][K] = dp[t][K - 1] + sm::res(), pos = t;
}
Rawgrass(l, mid - 1, lg, pos, K);
Rawgrass(mid + 1, r, pos, rg, K);
}
signed main() {
n = rd(), k = rd();
for (int i = 1; i <= n; ++i) a[i] = rd();
for (int i = 1; i <= n; ++i) sm::prog(1, i), dp[i][1] = sm::res();
for (int i = 2; i <= k; ++i) Rawgrass(1, n, 1, n, i);
printf("%lld\n", dp[n][k]);
return 0;
}

「codeforces - 868F」Yet Another Minimization Problem的更多相关文章

  1. 「CodeForces 546B」Soldier and Badges 解题报告

    CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...

  2. 「CodeForces 581D」Three Logos

    BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...

  3. 「CodeForces - 50C 」Happy Farm 5 (几何)

    BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...

  4. 「CodeForces - 598B」Queries on a String

    BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...

  5. 「CodeForces - 717E」Paint it really, really dark gray (dfs)

    BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...

  6. 「暑期训练」「Brute Force」 Far Relative’s Problem (CFR343D2B)

    题意 之后补 分析 我哭了,强行增加自己的思考复杂度...明明一道尬写的题- -(往区间贪心方向想了 其实完全没必要,注意到只有366天,直接穷举判断即可. 代码 #include <bits/ ...

  7. 「CodeForces 476A」Dreamoon and Stairs

    Dreamoon and Stairs 题意翻译 题面 DM小朋友想要上一个有 \(n\) 级台阶的楼梯.他每一步可以上 \(1\) 或 \(2\) 级台阶.假设他走上这个台阶一共用了 \(x\) 步 ...

  8. 「Codeforces 79D」Password

    Description 有一个 01 序列 \(a_1,a_2,\cdots,a_n\),初始时全为 \(0\). 给定 \(m\) 个长度,分别为 \(l_1\sim l_m\). 每次可以选择一个 ...

  9. 「Codeforces 468C」Hack it!

    Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...

  10. 「Codeforces 724F」Uniformly Branched Trees

    题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...

随机推荐

  1. Linux系统基础知识与自学方法

    Linux系统基础知识与自学方法 大部分非计算机相关的朋友也经常使用电脑,所以我们频繁接触的是Windows系统.关于这个系统的评价不一,一部分人觉得简洁快捷,一部分人觉得问题(病毒.弹窗)多多,总之 ...

  2. MySQL 存储引擎 InnoDB 内存结构之更改缓冲区

    更改缓冲区(Change Buffer)是一种特殊的数据结构,用于缓存不在缓冲池中的二级索引(secondary index)页的更改.可能来自于INSERT.UPDATE或DELETE操作(数据操作 ...

  3. APP流水线测试领域探索与最佳实践

    1 背景 APP端UI自动化因其特殊性(需连接测试机)一般都在本地执行,这种执行方式的局限性有以下弊端: 时效性低:研发每次打包后都需要通知测试,测试再去打包平台取包,存在时间差 研发自测或产品验收无 ...

  4. Windows系统使用Nginx部署Vue

    Nginx是什么? Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 ,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的R ...

  5. HTML前端js

    ajax请求方法书写 $.ajax({ type:"POST", url:CONTEXT_PATH+"/appAudit/insertSnDocCountAdmin&qu ...

  6. java根据配置文件读取值

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> ...

  7. Python爬虫突破验证码技巧 - 2Captcha

    在互联网世界中,验证码作为一种防止机器人访问的工具,是爬虫最常遇到的阻碍.验证码的类型众多,从简单的数字.字母验证码,到复杂的图像识别验证码,再到更为高级的交互式验证码,每一种都有其独特的识别方法和应 ...

  8. PTA 21级数据结构与算法实验5—树和二叉树

    目录 7-1 还原二叉树 7-2 朋友圈 7-3 修理牧场 7-4 玩转二叉树 7-5 根据后序和中序遍历输出先序遍历 7-6 完全二叉树的层序遍历 7-7 列出叶结点 7-8 部落 7-9 建立与遍 ...

  9. 好用的windows工具分享(20个)

    1.截图.画图全屏截图快捷键:printSreen窗口截图快捷键:alt+printSreen自定义截图工具:win+shift+s画图快捷键:cmd - mspaint可配合画图工具实现图片的编辑, ...

  10. redis 中的 list

    lpush K1 V1 V2 V3   左边加入list rpush k1 v1 v2 v3 右边加入list lpop k1 左边吐出一个值 rpop k1 右边吐出一个值 lrange k1 0 ...