Description

给出一个长度为 \(n\) 的序列,你需要将它分为 \(k\) 段,使得每一段的价值和最小,每一段的价值是这一段内相同的数的个数

题面

Solution

容易想到设 \(f[i][j]\) 表示前 \(i\) 个数分成 \(j\) 段的最小代价

\(f[i][j]=min(f[k][j-1]+w(k+1,i))\)

这个\(DP\)有决策单调性,可以分治优化

设 \(solve(l,r,L,R)\) 表示用区间 \([L,R]\) 内的决策去更新 \([l,r]\) 的函数,找到 \(mid\) 的决策点然后分治下去就可以了

对于 \(w\) 函数的处理还需要注意:

我们维护两个全局指针,每一次移动到指定的区间,这样就可以 \(O(1)\) 转移了,均摊指针的移动次数是 \(O(n*log)\) 的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,a[N],m,t[N],p=1,q=0;ll f[N][22],tot=0;
inline void upd(int l,int r){
while(q<r)q++,tot+=t[a[q]],t[a[q]]++;
while(p>l)p--,tot+=t[a[p]],t[a[p]]++;
while(q>r)t[a[q]]--,tot-=t[a[q]],q--;
while(p<l)t[a[p]]--,tot-=t[a[p]],p++;
}
inline void solve(int l,int r,int L,int R,int k){
if(l==r){
for(int i=min(R,r);i>=L;i--)
upd(i+1,l),f[l][k]=min(f[l][k],f[i][k-1]+tot);
return ;
}
int mid=(l+r)>>1,st=0;
for(int i=min(mid-1,R);i>=L;i--){
upd(i+1,mid);
if(tot+f[i][k-1]<f[mid][k])f[mid][k]=tot+f[i][k-1],st=i;
}
if(st)solve(l,mid,L,st,k),solve(mid+1,r,st,R,k);
else solve(mid+1,r,L,R,k);
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
memset(f,127/3,sizeof(f));f[0][1]=0;
for(int i=1;i<=n;i++)f[i][1]=f[i-1][1]+t[a[i]],t[a[i]]++;
memset(t,0,sizeof(t));
for(int i=2;i<=m;i++)
solve(1,n,1,n,i);
cout<<f[n][m]<<endl;
return 0;
}

Codeforces 868F. Yet Another Minimization Problem的更多相关文章

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

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

  2. Codeforces 868F Yet Another Minimization Problem(分治+莫队优化DP)

    题目链接  Yet Another Minimization Problem 题意  给定一个序列,现在要把这个序列分成k个连续的连续子序列.求每个连续子序列价值和的最小值. 设$f[i][j]$为前 ...

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

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

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

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

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

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

  6. CF 868 F. Yet Another Minimization Problem

    F. Yet Another Minimization Problem http://codeforces.com/contest/868/problem/F 题意: 给定一个长度为n的序列.你需要将 ...

  7. CF868 F. Yet Another Minimization Problem 决策单调优化 分治

    目录 题目链接 题解 代码 题目链接 CF868F. Yet Another Minimization Problem 题解 \(f_{i,j}=\min\limits_{k=1}^{i}\{f_{k ...

  8. Yet Another Minimization Problem

    Yet Another Minimization Problem 一个很显然的决策单调性. 方程是很显然的 $ f_i = \min{f_{j-1} + w(j,i)} $ . 它具有决策单调性,可以 ...

  9. 【codeforces 442B】 Andrey and Problem

    http://codeforces.com/problemset/problem/442/B (题目链接) 题意 n个人,每个人有p[i]的概率出一道题.问如何选择其中s个人使得这些人正好只出1道题的 ...

随机推荐

  1. SQL函数(不定时更新)

    sum求和:select sum(a) from table1 group by b   依据b列为a列求和 distinct去除重复:select distinct(a) from table1   ...

  2. Java 访问修饰符使用规则

    作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 1. ...

  3. Mysql内置功能《二》触发器

    使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询 一 创建触发器 # 插入前 CREATE TRIGGER tri_before_insert_tb1 BEFORE INS ...

  4. Crash的数字表格

    Crash的数字表格 求\(\sum_{i=1}^N\sum_{j=1}^Mlcm(i,j)\) 解 设\(N<M\),显然有 \[\sum_{i=1}^N\sum_{j=1}^M\frac{i ...

  5. mongodb 的基本操作

      1. show dbs 查看服务器中有多少个数据库   2.创建数据库 use <数据库名称> 注意如果数据库中没有表的话,那么数据库是不会显示的 如果存在这个表名则是切换 不存在则是 ...

  6. Linux下简易进度条的实现

    在生活中,进度条是很常见的,那么,进度条是如何实现的呢? 首先,进度条的动态是利用人眼视觉暂留效果的.实际上是如下过程: 先输出:[=                                  ...

  7. 利用Logstash plugins做更多的事情

    1. 引言 之前一篇文章<Logstash 介绍及linux下部署>,我们实现了logstash的安装以及简单的控制台标准输入输出测试,那么logstash能不能做更多的事情呢?答案是肯定 ...

  8. exec和xargs

    参考:http://www.cnblogs.com/itxdm/p/5936907.html 一. 先复习下find命令 1. name参数 find -name tom 或 find -iname ...

  9. Hello QT(译)

    简评:PySide2 是 QT 官方出品,值得期待 PySide2 第一个技术预览版快要发布了,在此给出一个简单的例子,来展示它将如何打开 Python世界的大门. 下面我们将使用 QWidgets ...

  10. iOS核心动画之anchorpoint

    anchorpoint是什么 All geometric manipulations to the view occur about the specified point 就是说所有的动画参考点都是 ...