洛谷CF868F Yet Another Minimization Problem(动态规划,决策单调性,分治)
貌似做所有的DP题都要先搞出暴力式子,再往正解上靠。。。
设\(f_{i,j}\)为前\(i\)个数分\(j\)段的最小花费,\(w_{l,r}\)为\([l,r]\)全在一段的费用。
\]
显然\(j\)这一维可以滚掉,于是变成\(g_i=\min\limits_{k=1}^{i}\{f_k+w_{k,i}\}\)做\(m\)遍(题目中的\(k\))
这又是一个决策单调性优化的式子。还是决策二分栈吗?要不得了,因为就算知道\(i,k\)也没法直接算\(f_k+w_{k,i}\)。
再次推广蒟蒻的DP优化总结
分治。总结里的概述蒟蒻也懒得再㧟一遍了。。。就说说这题的实现细节吧。
\(L^AT_EX\)画图?(雾
求解区间:\(|\gets\)预处理\(\to|\) \(l\frac{\qquad\qquad\qquad\downarrow^{mid}\qquad\qquad\qquad}{}r\)
决策区间:\(L\frac{\qquad\qquad\qquad\qquad\downarrow^{k}\qquad\qquad\qquad}{}R\)
设当前的求解区间为\([l,r]\),最优决策区间\([L,R]\)。对于当前分治的中点\(mid\),我们需要在\([L,\min(R,mid)]\)中暴力找到最优决策\(k\)。注意到从\(w_{l,r}\)到\(w_{l,r+1}\)或者从\(w_{l,r}\)到\(w_{l+1,r}\)都是可以做到\(O(1)\)的,只要开一个桶记录当前区间每个颜色出现次数就可以啦。把指针\(i\)从\(L\)移到\(\min(R,mid)\)并不断的算\(f_i+w_{i,mid}\),最终可以找到\(k\)。
注意一点,当进入求解区间时,我们的应该要确保\([L,l-1]\)的信息的存在,这样才能保证分治的复杂度。
于是我们考虑进子问题之前如何先处理出子问题的答案。先看左边的子问题(\([l,mid-1],[L,k]\))显然和当前问题的\([L,l-1]\)是一样的。注意到我们在求\(k\)的时候对\(w\)和桶都做了修改,那么我们直接还原回来就可以进左子问题了。
而右子问题呢?(\([mid+1,r],[k,R]\))它要预处理的是\([k,mid]\),而当前的是\([L,l-1]\)。所以我们先把右端点指针从\(l-1\)移到\(mid\),桶和\(w\)都加上去,再把左端点从\(L\)移到\(k-1\),桶和\(w\)都减掉,接着进去就好了。回溯的时候还是要还原到\([L,l-1]\),因为上一层要接着用。
注意答案是long long级别的。
代码经过了精心排版(尤其是分治那一块)
#include<cstdio>
#include<cstring>
#define RG register
#define R RG int
#define G c=getchar()
typedef long long LL;
const int N=1e5+9;
int a[N],c[N];
LL ff[N],gg[N],*f=ff,*g=gg;
inline int in(){
RG char G;
while(c<'-')G;
R x=c&15;G;
while(c>'-')x=x*10+(c&15),G;
return x;
}
void solve(R l,R r,R kl,R kr,RG LL w){//kl,kr就是决策区间
if(l>r)return;//边界
R m=(l+r)>>1,k=0,p=m<kr?m:kr,i;
for(i= l;i<=m;++i)w+=c[a[i]]++;//求k
for(i=kl;i<=p;++i)w-=--c[a[i]],g[m]>f[i]+w?g[m]=f[i]+w,k=i:0;
for(i=kl;i<=p;++i)w+=c[a[i]]++;//还原
for(i= l;i<=m;++i)w-=--c[a[i]];
solve(l,m-1,kl,k,w);
for(i= l;i<=m;++i)w+=c[a[i]]++;//调整
for(i=kl;i< k;++i)w-=--c[a[i]];
solve(m+1,r,k,kr,w);
for(i=kl;i< k;++i)++c[a[i]];//再次还原
for(i= l;i<=m;++i)--c[a[i]];
}
int main(){
R n=in(),k=in();
RG LL*tmp;
for(R i=1;i<=n;++i)//第一次直接算
f[i]=f[i-1]+c[a[i]=in()]++;
memset(c,0,(n+1)<<2);
while(--k){
memset(g,1,(n+1)<<3);
solve(1,n,1,n,0);
tmp=f;f=g;g=tmp;
}
printf("%lld\n",f[n]);
return 0;
}
洛谷CF868F Yet Another Minimization Problem(动态规划,决策单调性,分治)的更多相关文章
- CF868F Yet Another Minimization Problem(决策单调性)
题目描述:给定一个序列,要把它分成k个子序列.每个子序列的费用是其中相同元素的对数.求所有子序列的费用之和的最小值. 输入格式:第一行输入n(序列长度)和k(需分子序列段数).下一行有n个数,序列的每 ...
- Codeforces 868F. Yet Another Minimization Problem【决策单调性优化DP】【分治】【莫队】
LINK 题目大意 给你一个序列分成k段 每一段的代价是满足\((a_i=a_j)\)的无序数对\((i,j)\)的个数 求最小的代价 思路 首先有一个暴力dp的思路是\(dp_{i,k}=min(d ...
- 洛谷P1912 [NOI2009]诗人小G(决策单调性)
传送门 题解 决策单调性是个啥……导函数是个啥……这题解讲的是啥……我是个啥…… //minamoto #include<iostream> #include<cstdio> ...
- 【洛谷3515】[POI2011] Lightning Conductor(决策单调性)
点此看题面 大致题意: 给你一个序列,对于每个\(i\)求最小的自然数\(p\)使得对于任意\(j\)满足\(a_j\le a_i+p-\sqrt{|i-j|}\). 证明单调性 考虑到\(\sqrt ...
- 【BZOJ2830/洛谷3830】随机树(动态规划)
[BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...
- 【洛谷p1601】A+B Problem(高精)
高精度加法的思路还是很简单容易理解的 A+B Problem(高精)[传送门] 洛谷算法标签: 附上代码(最近懒得一批) #include<iostream> #include<cs ...
- 【洛谷4769】[NOI2018] 冒泡排序(动态规划_组合数学)
题目: 洛谷 4769 博客页面左下角的嘴嘴瓜封神之战中的题目 分析: 一个排列交换次数为 \(\frac{1}{2}\sum_{i=1}^{n}|i-p_i|\) 的充要条件是这个排列不存在长度为 ...
- 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)
洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...
- 洛谷P1973 [NOI2011]Noi嘉年华(动态规划,决策单调性)
洛谷题目传送门 DP题怕是都要大大的脑洞...... 首先,时间那么大没用,直接离散化. 第一问还好.根据题意容易发现,当一堆活动的时间有大量重叠的时候,更好的办法是把它们全部安排到一边去.那么我们转 ...
随机推荐
- ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)
ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...
- JavaWeb学习总结-12 JSTL标签语言
一 JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了 ...
- 同一个解决方案或有依赖关系的两个项目引用同名但不同版本的DLL
问题描述 我们最近在使用Redis作Session的集中化,中间碰到了一个如下问题:我们有一些项目比较老,引用了NewtonJson的4.0.3.0版本的DLL,但是Redis提供的C#集成DLL引用 ...
- 【LGR-047】洛谷5月月赛
这次我期待了很久的Luogu月赛崩掉了 传说中的Luogu神机就这样被卡爆了 然后我过了20min才登上Luogu的网站,30min后才看到题目 然后交T1TM的不给我测!!!然后又交了一次机子就炸了 ...
- mysql 通过慢查询日志查写得慢的sql语句
MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_t ...
- 一个很好用的在线编辑、展示、分享、交流JavaScript 代码的平台
在发表博客时,有一些代码只能粘贴进去,而不能看到代码运行的效果,需要读者把代码粘贴进自己的编辑器,然后再运行看效果,这是一件很耗时的事情 在平时百度的时候,我发现一些网站可以在线预览功能,而且可以在线 ...
- CSS 尺寸 (Dimension) 实例
CSS 尺寸 (Dimension) 实例CSS 尺寸属性CSS 尺寸属性允许你控制元素的高度和宽度.同样,还允许你增加行间距. 属性 描述height 设置元素的高度.line-height 设置行 ...
- windows平台下编辑的内容传到linux平台出现中文乱码的解决办法
现象说明:在windows下编辑的内容,上传到linux平台下出现中文乱码.如下: 在windows平台编写haha.txt文件,内容如下: 上传到linux平台,出现中文乱码,如下: 基本上面出现的 ...
- Junit4使用实验报告
一.题目简介 Junit4的使用及求和测试. 二.源码的github链接 https://github.com/bjing123/test-/blob/master/Arithmetic.txt ht ...
- ☆C++学习心得
C++是我进大学的学的第一种编程语言,在高中的时候有电脑课,有教过部分的VB语言,所以其实对编程也并不是非常的陌生,刚开是上课也觉得感觉不难,都懂,没多少课后,恍了个神..居然听不懂了!老师经常让我们 ...