题目链接  Yet Another Minimization Problem

题意  给定一个序列,现在要把这个序列分成k个连续的连续子序列。求每个连续子序列价值和的最小值。

设$f[i][j]$为前$i$个数分成$j$段的最优解

不难得出状态转移方程$f[i][j] = min(f[k][j - 1], calc(j + i, i))$

该DP具有决策单调性

即若$f[i][j]$是从$f[x][j - 1]$转移到的,$f[i+1][j]$是从$f[y][j - 1]$转移到的,那么一定有$x <= y$。

考虑到这一点就可以用分治优化。

还有一点就是$calc()$的计算。

用莫队计算就可以了(分治的时候同一个递归状态下莫队查询端点的改变都是连续的)

时间复杂度$O(nklogn)$

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 1e5 + 10;
const int A = 22; LL f[N][A], ret;
int a[N], cnt[N];
int n, m, l, r; void query_init(){
memset(cnt, 0, sizeof cnt);
l = 1, r = 0;
ret = 0;
} LL query(int ql, int qr){
while (r < qr){
++r;
ret += 1ll * cnt[a[r]];
++cnt[a[r]];
} while (r > qr){
--cnt[a[r]];
ret -= 1ll * cnt[a[r]];
--r;
} while (l > ql){
--l;
ret += 1ll * cnt[a[l]];
++cnt[a[l]];
} while (l < ql){
--cnt[a[l]];
ret -= 1ll * cnt[a[l]];
++l;
} return ret;
} void solve(int j, int l, int r, int st, int ed){
if (l > r) return;
int mid = (l + r) >> 1;
int x; rep(i, st, min(mid, ed)){
LL now = query(i, mid);
if (f[i - 1][j - 1] + now <= f[mid][j]){
f[mid][j] = f[i - 1][j - 1] + now;
x = i;
}
} if (l != r){
solve(j, l, mid - 1, st, x);
solve(j, mid + 1, r, x, ed);
}
} int main(){ scanf("%d%d", &n, &m);
rep(i, 1, n) scanf("%d", a + i); query_init(); rep(i, 1, n) rep(j, 0, m) f[i][j] = 1e18;
rep(i, 1, n) f[i][1] = query(1, i);
rep(j, 2, m) solve(j, 1, n, 1, n); printf("%lld\n", f[n][m]);
return 0;
}

Codeforces 868F Yet Another Minimization Problem(分治+莫队优化DP)的更多相关文章

  1. Codeforces 868F. Yet Another Minimization Problem【决策单调性优化DP】【分治】【莫队】

    LINK 题目大意 给你一个序列分成k段 每一段的代价是满足\((a_i=a_j)\)的无序数对\((i,j)\)的个数 求最小的代价 思路 首先有一个暴力dp的思路是\(dp_{i,k}=min(d ...

  2. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  3. CodeForces 868F Yet Another Minimization Problem(决策单调性优化 + 分治)

    题意 给定一个序列 \(\{a_1, a_2, \cdots, a_n\}\),要把它分成恰好 \(k\) 个连续子序列. 每个连续子序列的费用是其中相同元素的对数,求所有划分中的费用之和的最小值. ...

  4. Codeforces 868F Yet Another Minimization Problem 决策单调性 (看题解)

    Yet Another Minimization Problem dp方程我们很容易能得出, f[ i ] = min(g[ j ] + w( j + 1, i )). 然后感觉就根本不能优化. 然后 ...

  5. Codeforces 868F. Yet Another Minimization Problem

    Description 给出一个长度为 \(n\) 的序列,你需要将它分为 \(k\) 段,使得每一段的价值和最小,每一段的价值是这一段内相同的数的个数 题面 Solution 容易想到设 \(f[i ...

  6. 【CodeForces】868F. Yet Another Minimization Problem

    原题链接 题目大意是有N个数,分成K段,每一段的花费是这个数里相同的数的数对个数,要求花费最小 如果只是区间里相同数对个数的话,莫队就够了 而这里是!边单调性优化边莫队(只是类似莫队)!而移动的次数和 ...

  7. Codeforces 375D - Tree and Queries(dfs序+莫队)

    题目链接:http://codeforces.com/contest/351/problem/D 题目大意:n个数,col[i]对应第i个数的颜色,并给你他们之间的树形关系(以1为根),有m次询问,每 ...

  8. Codeforces 940F Machine Learning (带修改莫队)

    题目链接  Codeforces Round #466 (Div. 2) Problem F 题意  给定一列数和若干个询问,每一次询问要求集合$\left\{c_{0}, c_{1}, c_{2}, ...

  9. Codeforces 700D - Huffman Coding on Segment(莫队+根分)

    Codeforces 题目传送门 & 洛谷题目传送门 好家伙,刚拿到此题时我连啥是 huffman 编码都不知道 一种对 \(k\) 个字符进行的 huffman 编码的方案可以看作一个由 \ ...

随机推荐

  1. Yii2 HelloWord

    一.安装Yii2 可以直接官网或github下载: https://github.com/yiisoft/yii2 下载完后进入项目的web/目录,入口文件为该目录下的index.php,这里直接启用 ...

  2. 【nginx】nginx.sh nginx 安装脚本

    #! /bin/shcd /usr/local/srcwget http://nginx.org/download/nginx-1.10.1.tar.gzecho 'download success' ...

  3. 初学Python02

    数据类型和变量: 1.整数  整数在Python中直接输入就好,没有特殊要求(正负整数皆可).由于计算机是二进制的,有时候会使用十六进制表示数字,0X+0-9或者a-f来表示. 2.浮点数   浮点数 ...

  4. Html5_标签

    HTML 1.一套规则,浏览器认识的规则. 2.开发者: 学习Html规则 开发后台程序: - 写Html文件(充当模板的作用) ****** - 数据库获取数据,然后替换到html文件的指定位置(W ...

  5. 水题:UVa133-The Dole Queue

    The Dole Queue Time limit 3000 ms Description In a serious attempt to downsize (reduce) the dole que ...

  6. filter 作用

     过滤器 filter用于拦截用户请求,在服务器作出响应前,可以在拦截后修改request和response,这样实现很多开发者想得到的功能. filter是一个可以复用的代码片段,可以用来转换HTT ...

  7. css 阴影使用

    文本阴影 p{ text-shadow: 5px 5px 5px #FF0000; } text-shadow: h-shadow v-shadow blur color; text-shadow: ...

  8. Django Model two

    Django_model: eg: class XXXX(models.Model): nid = models.AutoField(primary_Key=True) name = models.C ...

  9. I love you

    while(true) { printf("I love you"); } 字母解析 I-Inject--投入 投入,这个投入有很多概念,有对自己所爱的人,投入自己所有的感情,让你 ...

  10. tab选项卡不同样式的效果

    一般的tab选项卡就只能两种样式,一种是选中或者是划过这个选项卡样式,一种是没选中或者没划过选项卡样式. 现在有这种需求,就是选中或划过tab选卡要不同样式.比如tab1选中或者划过是红色,tab2选 ...