CF868F Yet Another Minimization Problem
题目描述:
给定一个序列,要把它分成k个子序列。每个子序列的费用是其中相同元素的对数。求所有子序列的费用之和的最小值。
输入格式:第一行输入n(序列长度)和k(需分子序列段数)。下一行有n个数,序列的每一个元素。
输出格式:输出一个数,费用和的最小值。
2<=n<=10^5,2<=k<=min(n,20),序列的每一个元素值大于等于1,小于等于n。
Solution
思路还是比较单纯
\]
有m次每次是\(O(n)\)的转移.
可以利用决策单调性转移.
方法是将区间从中间分开.
找到分界点的决策点.
这样原区间和决策区间都被一份为二.
于是递归处理
就是实在有点麻烦.
Code
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
const int N = 100005;
const int inf = 0x3f3f3f3f;
using std:: fill;
using std:: swap;
using std:: min;
using std:: max;
int A[N];
long long f[N];
long long g[N];
int B[N];
void solve(int l, int r, int L, int R, long long P) {
if (l > r) return ;
int m = l + r >> 1;
int p = min(m, R);
int M = 0;
for (int i = l; i <= m; i += 1) P += B[A[i]], B[A[i]] += 1;
for (int i = L; i <= p; i += 1)
P -= (B[A[i]] -= 1), g[i] + P < f[m] ? M = i, f[m] = g[i] + P : 0;
for (int i = l; i <= m; i += 1) P -= (B[A[i]] -= 1);
for (int i = L; i <= p; i += 1) P += B[A[i]], B[A[i]] += 1;
solve(l, m - 1, L, M, P);
for (int i = L; i < M; i += 1) P -= (B[A[i]] -= 1);
for (int i = l; i <= m; i += 1) P += B[A[i]], B[A[i]] += 1;
solve(m + 1, r, M, R, P);
for (int i = l; i <= m; i += 1) B[A[i]] -= 1;
for (int i = L; i < M; i += 1) B[A[i]] += 1;
}
int main () {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i += 1)
scanf("%d", &A[i]);
for (int i = 1; i <= n; i += 1)
g[i] = g[i - 1] + B[A[i]], B[A[i]] += 1;
memset(B, false, sizeof B);
for (int i = 1; i <= m; i += 1) {
memset(f, 0x3f, sizeof f);
solve(1, n, 1, n, 0);
swap(f, g);
}
printf("%lld\n", f[n]);
return 0;
}
CF868F Yet Another Minimization Problem的更多相关文章
- CF868F Yet Another Minimization Problem 分治决策单调性优化DP
题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...
- 洛谷CF868F Yet Another Minimization Problem(动态规划,决策单调性,分治)
洛谷题目传送门 貌似做所有的DP题都要先搞出暴力式子,再往正解上靠... 设\(f_{i,j}\)为前\(i\)个数分\(j\)段的最小花费,\(w_{l,r}\)为\([l,r]\)全在一段的费用. ...
- cf868F. Yet Another Minimization Problem(决策单调性 分治dp)
题意 题目链接 给定一个长度为\(n\)的序列.你需要将它分为\(m\)段,每一段的代价为这一段内相同的数的对数,最小化代价总和. \(n<=10^5,m<=20\) Sol 看完题解之后 ...
- CF868F Yet Another Minimization Problem(决策单调性)
题目描述:给定一个序列,要把它分成k个子序列.每个子序列的费用是其中相同元素的对数.求所有子序列的费用之和的最小值. 输入格式:第一行输入n(序列长度)和k(需分子序列段数).下一行有n个数,序列的每 ...
- CF868 F. Yet Another Minimization Problem 决策单调优化 分治
目录 题目链接 题解 代码 题目链接 CF868F. Yet Another Minimization Problem 题解 \(f_{i,j}=\min\limits_{k=1}^{i}\{f_{k ...
- Codeforces 868F Yet Another Minimization Problem 决策单调性 (看题解)
Yet Another Minimization Problem dp方程我们很容易能得出, f[ i ] = min(g[ j ] + w( j + 1, i )). 然后感觉就根本不能优化. 然后 ...
- CF 868 F. Yet Another Minimization Problem
F. Yet Another Minimization Problem http://codeforces.com/contest/868/problem/F 题意: 给定一个长度为n的序列.你需要将 ...
- Codeforces 868F Yet Another Minimization Problem(分治+莫队优化DP)
题目链接 Yet Another Minimization Problem 题意 给定一个序列,现在要把这个序列分成k个连续的连续子序列.求每个连续子序列价值和的最小值. 设$f[i][j]$为前 ...
- Yet Another Minimization Problem
Yet Another Minimization Problem 一个很显然的决策单调性. 方程是很显然的 $ f_i = \min{f_{j-1} + w(j,i)} $ . 它具有决策单调性,可以 ...
随机推荐
- React Patterns
Contents Stateless function JSX spread attributes Destructuring arguments Conditional rendering Chil ...
- 第三方库安装——lxml
环境 操作系统:CentOS 6.7 32-bit Python:2.6.6 安装 安装依赖软件 yum -y install gcc make python-devel libxml2-devel ...
- Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)
F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...
- STM32 - 软件设置单片机重启
__set_FAULTMASK();//关闭总中断 NVIC_SystemReset();//请求单片机重启 执行NVIC_SystemReset()函数不允许被打断,所以关总中断
- Android SearchView设置与用法的那点事儿
// 设置该SearchView默认是否自动缩小为图标 mSearchView.setIconifiedByDefault(false); // 为该SearchView组件设置事件监听器 mSear ...
- sql生成一个日期表
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Auth ...
- [洛谷P3527] [POI2011]MET-Meteors
洛谷题目链接:[POI2011]MET-Meteors 题意翻译 Byteotian Interstellar Union有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1 ...
- 使用shell脚本往文件中加一列
上午大学同学问了我一个脚本的问题,大概需求就是看到所有端口的开启情况,还要知道每个端口的应用程序路径,而且要和之前的数据齐平,就是再加一列数据.我腚眼一看,非常容易嘛,但由于当时忙,所以就说中午给他发 ...
- 好用的python库(转)
这个专区就是用来分享你在使用 Python 过程中发现的或者自己写的 Python 库.有时候一个好用的库将大大节省一个开发者的时间,也会让开发者多这个库的作者感激涕零的.例如我在开发 Pythonz ...
- ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer
21:09:22.221 [MessageBroker-3] INFO c.t.s.s.impl.StockNewsServiceImpl - [2017-12-16 21:09:22] execut ...