cf868F. Yet Another Minimization Problem(决策单调性 分治dp)
题意
给定一个长度为\(n\)的序列。你需要将它分为\(m\)段,每一段的代价为这一段内相同的数的对数,最小化代价总和。
\(n<=10^5,m<=20\)
Sol
看完题解之后的感受:

首先列出裸的dp方程,\(f[i][j]\)表示前\(i\)个位置,切了\(j\)次,转移的时候枚举上一次且在了哪儿
\(f[i][j] = max(f[k][j - 1] + w(k, i))\)
\(w(k, i)\)表示\([k, i]\)内相同的数的对数。。
然后sb的我以为拿个单调队列维护一下就完了结果发现转移是\(O(n)\)的??
标算真神仙Orz
因为转移不是\(O(n)\)的,所以我们可以分治的去做
假设当前要求的区间为\([l, r]\),可以从\([L, R]\)转移而来,\(mid = (l + r)/ 2\)的决策点为\(p\)
那么\([l, mid - 1]\)的转移区间一定在\([L, p]\),\([mid+1, r]\)的转移区间一定是\([p, R]\),递归的做即可
画出图来应该是这样的
求解区间:\(|\gets\)预处理\(\to |\) \(l\frac{\qquad\qquad\qquad\downarrow^{mid}\qquad\qquad\qquad}{}r\)
决策区间:\(L\frac{\qquad\qquad\qquad\downarrow^{p}\qquad\qquad\qquad}{}R\)
转移的时候需要记录每个数的出现次数,每次转移时\(O(1)\)的
总的时间复杂度为:\(O(nlognk)\)
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 1e5 + 10;
inline int read() {
int x = 0, f = 1; char c = getchar();
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, K, a[MAXN], b[MAXN];
LL f[MAXN], g[MAXN];
void solve(int l, int r, int L, int R, LL w) {
if(l > r) return ;
int mid = l + r >> 1, p = min(mid, R), k = 0;
for(int i = l; i <= mid; i++) w += b[a[i]]++;
for(int i = L; i <= p; i++) w -= --b[a[i]], f[mid] > g[i] + w ? f[mid] = g[i] + w, k = i : 0;
for(int i = l; i <= mid; i++) w -= --b[a[i]];
for(int i = L; i <= p; i++) w += b[a[i]]++;
solve(l, mid - 1, L, k, w);
for(int i = L; i < k; i++) w -= --b[a[i]];
for(int i = l; i <= mid; i++) w += b[a[i]]++;
solve(mid + 1, r, k, R, w);
for(int i = l; i <= mid; i++) --b[a[i]];
for(int i = L; i < k; i++) ++b[a[i]];
}
main() {
N = read(); K = read();
for(int i = 1; i <= N; i++) a[i] = read(), g[i] = g[i - 1] + b[a[i]]++; memset(b, 0, sizeof(b));
while(K--) {memset(f, 0x7f, sizeof(f)); solve(1, N, 1, N, 0); swap(f, g);}
cout << f[N];
}
cf868F. Yet Another Minimization Problem(决策单调性 分治dp)的更多相关文章
- CodeForces 868F Yet Another Minimization Problem(决策单调性优化 + 分治)
题意 给定一个序列 \(\{a_1, a_2, \cdots, a_n\}\),要把它分成恰好 \(k\) 个连续子序列. 每个连续子序列的费用是其中相同元素的对数,求所有划分中的费用之和的最小值. ...
- Codeforces 868F Yet Another Minimization Problem 决策单调性 (看题解)
Yet Another Minimization Problem dp方程我们很容易能得出, f[ i ] = min(g[ j ] + w( j + 1, i )). 然后感觉就根本不能优化. 然后 ...
- [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的 ...
- CF868F Yet Another Minimization Problem 分治决策单调性优化DP
题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...
- CF868 F. Yet Another Minimization Problem 决策单调优化 分治
目录 题目链接 题解 代码 题目链接 CF868F. Yet Another Minimization Problem 题解 \(f_{i,j}=\min\limits_{k=1}^{i}\{f_{k ...
- P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...
- 4951: [Wf2017]Money for Nothing 决策单调性 分治
Bzoj4951:决策单调性 分治 国际惯例题面:一句话题面:供应商出货日期为Ei,售价为Pi:用户收购截止日期为Si,收购价格为Gi.我们要求max((Si-Ej)*(Gi-Pj)).显然如果我们把 ...
- [NAIPC2016]Jewel Thief(决策单调性+分治)
[NAIPC2016]Jewel Thief(决策单调性+分治) 题面 原题提交地址(题目编号H) 原题面下载地址 有\(n\)个物品,每个物品有一个体积\(w_i\)和价值\(v_i\),现在要求对 ...
- P3515 [POI2011]Lightning Conductor(决策单调性分治)
P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下 ...
随机推荐
- 洛谷P3648 [APIO2014]序列分割(斜率优化)
传送门 没想到这种多个状态转移的还能用上斜率优化……学到了…… 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...
- 牛客寒假算法基础集训营4 F Applese 的大奖
链接:https://ac.nowcoder.com/acm/contest/330/H来源:牛客网 Applese 和它的小伙伴参加了一个促销的抽奖活动,活动的规则如下:有一个随机数生成器,能等概率 ...
- 洛谷 P1028 数的计算
嗯... 首先这道题想到的就是递推.... 但是递推失败 (不知道自己是怎么想的 然后又想打一个暴力,但是数的最高位太难存储了,所以又放弃了(并且好像这个暴力大约500就会炸... 然后看了题解,才发 ...
- springboot整合dubbo注解方式
工程结构: 主pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
- Java实现微信小程序支付(准备)
Java语言开发微信小程序支付功能: 1.通过https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1路径到官方下载Java的支付SD ...
- 说Gradle
说Gradle 刚开始认识Gradle这个名词是在蘑菇街的一场 交流会上,当时只是一个概念:第二面,是试图下载编译spring源码的时候:第三面,就是我司较真的安卓主程,有一天兴高彩烈的跟我说,我 ...
- Linux下Redis安装使用,主从模式,哨兵模式与PHP扩展(PHP7适用)
一,软件准备 #redis wget http://download.redis.io/releases/redis-3.0.7.tar.gz #phpredis 非php7使用 下载后文件名为:ph ...
- delete ELK index
Go to tab “Dev Tools”4. On the left console type:GET _cat/indices?v&s=store.size:descand execute ...
- Laravel5.1接收json数据
<?php namespace App\Http\Controllers;use Illuminate\Routing\Controller as BaseController; use Ill ...
- Qt中的布局管理器
1. 布局管理器提供相关的类对界面组件进行布局管理,能够自动排列窗口中的界面组件,窗口变化后能自动更新界面组件的大小. 2. QLayout是Qt布局管理器的抽象基类,通过继承QLayout实现了功能 ...