链接:https://codeforces.com/problemset/problem/868/F

首先n^2m的dp很容易想,f(j,i)表示考虑划分了j个集合,最后一个集合结尾在i的最小值。显然它具有决策单调性,即如果f(j,i)最后一个划分的集合在最优方案下起始位置是k,那么当i增加k一定单调不降(如果有多个最优决策位置选任意一个都是满足的,因为实际上i增大一定是在最右边的最优决策对它影响最小,所以最右的及它左边的都满足该性质),考虑用这个性质优化dp,假设当前j已经确定,要处理所有i在[l,r]内的答案,那么可以先求mid的答案,递归处理左右区间,可以发现左右区间因为之前那个性质可能是决策位置的总长度才等于当前区间的可能长度,所以如果能做到每一层求mid答案与可能决策区间长度同阶即可做到nm^log,而发现不与当前决策区间同阶的限制就是要算mid~可能决策区间右端点的数的贡献,而这个东西发现我们每次分治的时候只要不把整一层信息清空带着当前层的右端点mid到下一层移动右端点移动也是总和n^log了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+100;
const ll inf=1e18;template<class T>
void rd(T &x)
{char c=getchar();x=0;bool f=0;while(!isdigit(c))f|=(c=='-'),c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();if(f)x=-x;
}int n,m,a[N],dep,nw_l,nw_r;
vector<int>bin;
ll cnt[N],f[22][N],res;ll get(int x)
{return max(0LL,cnt[x]*(cnt[x]-1)/2);}
void add(int x)
{res-=get(a[x]),cnt[a[x]]++,res+=get(a[x]);}
void del(int x)
{res-=get(a[x]),cnt[a[x]]--,res+=get(a[x]);}void sol(int l,int r,int may_l,int may_r)
{ll mn=inf;int ps,mid=(l+r)>>1;while(nw_r<mid)add(++nw_r);;while(nw_r>mid)del(nw_r--);for(int i=min(may_r,mid);i>=may_l;i--){while(nw_l>i)add(--nw_l);while(nw_l<i)del(nw_l++);if(res+f[dep-1][i-1]<=mn)ps=i,mn=res+f[dep-1][i-1];}f[dep][mid]=mn;if(l<mid)sol(l,mid-1,may_l,ps);if(r>mid)sol(mid+1,r,ps,may_r);}int main()
{rd(n),rd(m);for(int i=1;i<=n;i++)rd(a[i]);for(int i=1;i<=n;i++)add(i),f[1][i]=res;memset(cnt,0,sizeof cnt);for(int j=2;j<=m;j++){memset(cnt,0,sizeof cnt);nw_l=1,nw_r=0,dep=j,res=0;sol(1,n,1,n);}printf("%lld\n",f[m][n]);
}

CF868F 分治优化dp相关推荐

  1. [CF1442 D] Sum(分治优化dp + 结论)

    CF1442D Sum problem solution code problem luogu翻译 solution 部分分做法,预处理每组前缀和,暴力背包 dpdpdp 转移:dpi,j=max⁡{ ...

  2. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  3. 【BZOJ2149】拆迁队,分治+斜率优化DP

    传送门 思路还不错的一道题目,难度不大,但是我在写的时候出了一些细节上的错误 显然题目中的两问都可以通过DP来解决 f[i]f[i]表示保留旧房子ii时,1-i1-i最多能保留多少个旧房子 g[i]g ...

  4. 『摆渡车 斜率优化dp及总结』

    摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...

  5. 斜率优化DP 与数形结合思想

    前言 最近才入了DP优化的大坑-- 发现斜率优化DP还是很有用的 下面会结合一道例题,同时讲解斜率优化DP 正文 先看一下例题:HDU3507 题目大意:有一串数列,要把它分割成若干段 每一段的代价是 ...

  6. 【决策单调性分治优化/四边形不等式优化】监狱警卫

    前言 模板一套就AC了... 题目 guardians.cpp 1S/128M 你负责将监狱的警卫指派到最疯狂的罪犯所在的监狱. 一共有N间牢房排列成一行,编号从1~N. 第i间牢房恰好容纳了一个疯狂 ...

  7. [学习笔记]矩阵乘法及其优化dp

    1.定义: $c[i][j]=\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)=n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义. 2.结 ...

  8. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

  9. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

最新文章

  1. 搭建前端私有npm杂记
  2. Visual Studio Debug 教程 之 入门
  3. 火的不要不要的公有云和私有云都是什么鬼?
  4. java虚拟机06-内存分区/新生代、老年代
  5. 黄仕沛经方医案医话精选(上) 王晓军 整理
  6. 【OpenCV 例程200篇】41. 图像的灰度变换(灰度级分层)
  7. 不满6位补零 字符串_vb6.0中字符串中不足位数前面补0的方法
  8. leetcode —— 面试题 17.08. 马戏团人塔
  9. Cs231N_学习笔记
  10. 妙啊!类别不平衡上的半监督学习
  11. 【博客项目】—cookie和session(七)
  12. FOLDER FORM 问题
  13. 四、矩阵的变换与分解
  14. [精易软件开发工程师Leo学习笔记]011DeBug(调试)
  15. 本台计算机没有权限使用网络资源,你可能没有权限使用网络资源,详细教您你可能没有权限使用网络资源怎么解决...
  16. 那些著名的黑客事件 十二
  17. 湿气重怎么办?湿气有哪些危害?祛湿建议首选云植祛湿颗粒
  18. 接口自动化测试框架介绍
  19. 皮亚诺的数概念起点和算术公理1-2告诉我们什么?—— 皮亚诺读后之四
  20. 如何从AD中彻底删除Skype For Business(下篇)

热门文章

  1. 为什么地球上的第一个复杂生命体出现在海洋中
  2. 线性方程组matlab解法,线性方程组解法及其MATLAB实践
  3. Python实战小项目—绘制玫瑰花送给女朋友叭
  4. Android5.1.1-高通msm8916平台添加Etehrnet。(驱动+上层framworks)
  5. win32画窗体背景
  6. 吉他铺怎么看(很全)
  7. 揭密备份恢复的原理!
  8. 无线遥控开关 开关和遥控器配对学习
  9. 【前端】在vue项目中使用mixpanel记录用户访问量,5s内同一客户端记录一次
  10. flask入门和进阶五(关注功能的实现Followers)