Yet Another Minimization Problem
Yet Another Minimization Problem
一个很显然的决策单调性。
方程是很显然的 $ f_i = \min{f_{j-1} + w(j,i)} $ 。
它具有决策单调性,可以参考钟神的 Blog
我们考虑怎么实现这个东西,按照上次 DLS 讲的,考虑 solve(l,r,L,R) 表示 我们当前在处理 $ l,r $ 的 $ dp $ 值,我们知道当前决策点在 $ L,R $ 内。
然后考虑怎么求,先对 $ mid $ 暴力跑出决策位置,然后分治 solve(l,mid-1,L,op),solve(mid+1,r,op,R)。复杂度是 $ nlogn $ 的,因为每一层分治的时间是 $ O(r - l + R - L) $
但是还得求 $ w(l,r) $,这个东西我们可以直接类似莫队来算,因为总的移动的位置的和就是前面的 $ R - L $ 的和,这个是不影响复杂度的。
代码很短,也很好写。。(没开llwa了两发
#include "iostream"
#include "algorithm"
#include "cstring"
#include "cstdio"
using namespace std;
#define MAXN 100006
#define chkmn( a , b ) ( (a) > (b) ? ( (a) = (b) , 1 ) : 0 )
#define chkmx( a , b ) ( (a) < (b) ? ( (a) = (b) , 1 ) : 0 )
#define f( a ) ( (a) > 0 ? (a) : 0 )
int n , k;
int A[MAXN] , cn[MAXN];
int L = 1 , R = 0;
long long cw , dp[MAXN] , nw[MAXN];
void upd(int c,int d){ cw += 1ll * d * cn[c] * (cn[c] - 1) / 2;}
long long getw( int l , int r ) {
while( L < l ) upd( A[L] , -1 ) , -- cn[A[L]] , upd( A[L] , 1 ) , ++ L;
while( R > r ) upd( A[R] , -1 ) , -- cn[A[R]] , upd( A[R] , 1 ) , -- R;
while( L > l ) -- L , upd( A[L] , -1 ) , ++ cn[A[L]] , upd( A[L] , 1 );
while( R < r ) ++ R , upd( A[R] , -1 ) , ++ cn[A[R]] , upd( A[R] , 1 );
return cw;
}
void solve( int l , int r , int L , int R ) {
if( l > r ) return;
int mid = l + r >> 1 , op; nw[mid] = 0x3f3f3f3f3f3f3f3f;
for( int i = min( R , mid ) ; i >= L ; -- i ) {
if( chkmn( nw[mid] , dp[i - 1] + getw( i , mid ) ) ) op = i;
}
if( l == r ) return;
solve( l , mid - 1 , L , op ) , solve( mid + 1 , r , op , R );
}
int main() {
cin >> n >> k;
for( int i = 1 ; i <= n ; ++ i ) scanf("%d",&A[i]);
memset( dp , 0x3f3f , sizeof dp ) , memset( nw , 0x3f3f , sizeof nw ) , dp[0] = 0;
for( int i = 1 ; i <= k ; ++ i ) {
solve( 1 , n , 1 , n );
swap( nw , dp );
}
cout << dp[n] << endl;
}
Yet Another Minimization Problem的更多相关文章
- Codeforces 868F Yet Another Minimization Problem 决策单调性 (看题解)
Yet Another Minimization Problem dp方程我们很容易能得出, f[ i ] = min(g[ j ] + w( j + 1, i )). 然后感觉就根本不能优化. 然后 ...
- CF868 F. Yet Another Minimization Problem 决策单调优化 分治
目录 题目链接 题解 代码 题目链接 CF868F. Yet Another Minimization Problem 题解 \(f_{i,j}=\min\limits_{k=1}^{i}\{f_{k ...
- CF 868 F. Yet Another Minimization Problem
F. Yet Another Minimization Problem http://codeforces.com/contest/868/problem/F 题意: 给定一个长度为n的序列.你需要将 ...
- Codeforces 868F Yet Another Minimization Problem(分治+莫队优化DP)
题目链接 Yet Another Minimization Problem 题意 给定一个序列,现在要把这个序列分成k个连续的连续子序列.求每个连续子序列价值和的最小值. 设$f[i][j]$为前 ...
- CodeForces 868F Yet Another Minimization Problem(决策单调性优化 + 分治)
题意 给定一个序列 \(\{a_1, a_2, \cdots, a_n\}\),要把它分成恰好 \(k\) 个连续子序列. 每个连续子序列的费用是其中相同元素的对数,求所有划分中的费用之和的最小值. ...
- CF868F Yet Another Minimization Problem 分治决策单调性优化DP
题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...
- 洛谷CF868F Yet Another Minimization Problem(动态规划,决策单调性,分治)
洛谷题目传送门 貌似做所有的DP题都要先搞出暴力式子,再往正解上靠... 设\(f_{i,j}\)为前\(i\)个数分\(j\)段的最小花费,\(w_{l,r}\)为\([l,r]\)全在一段的费用. ...
- Codeforces 868F. Yet Another Minimization Problem【决策单调性优化DP】【分治】【莫队】
LINK 题目大意 给你一个序列分成k段 每一段的代价是满足\((a_i=a_j)\)的无序数对\((i,j)\)的个数 求最小的代价 思路 首先有一个暴力dp的思路是\(dp_{i,k}=min(d ...
- Codeforces 868F. Yet Another Minimization Problem
Description 给出一个长度为 \(n\) 的序列,你需要将它分为 \(k\) 段,使得每一段的价值和最小,每一段的价值是这一段内相同的数的个数 题面 Solution 容易想到设 \(f[i ...
随机推荐
- 【UE4 调试】C++ 常见编译 warnnings/errors
error LNK2019: unresolved external symbol "" referenced in function 描述 Link错误.无法解析的外部符号 解决 ...
- elasticsearch嵌套对象的映射
在es中,我们有时候可能需要映射,{ "field" : "xx" , "field01" : [] }这样格式的嵌套对象,默认情况下es会 ...
- 攻防世界 杂项 3.神奇的Modbus
[目标] 了解modbus协议 [工具] Wireshark [分析过程] 在数据包中寻找flag就行,flag是明文形式存储. 工业设备消息传输使用modbus协议.所以我就采集了modbus的通信 ...
- linux shell脚本中的开头#!/bin/bash的含义
对于linux上需要执行 的shell脚本,通常第一行的内容是 #!/bin/bash 当然有很多时候不规范的写法可以忽略掉这一句,执行起来好像也是ok,结果没什么不一样 .. 这只是因为在我们常用 ...
- hdu 5166 Missing number(。。。)
题意: 有一个排列,但少了两个数.给你少了这两个数的排列.找出是哪两个数. 思路: 看代码,,, 代码: int a[1005]; int main(){ int T; cin>>T; w ...
- OpenAPITools 实践
OpenAPITools 可以依据 REST API 描述文件,自动生成服务端桩(Stub)代码.客户端 SDK 代码,及文档等.其是社区版的 Swagger ,差异可见:OpenAPI Genera ...
- JMeter跨线程组保持登录(多线程组共享cookie)
使用__setProperty设置全局变量: 1.jmeter中创建一个登录请求,然后执行,察看结果树-->查看返回cookie信息,我的是在Response data中的 Response h ...
- c++学习笔记(十一)
函数重载(overloading) 概念 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同, ...
- 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」小白专区之领略一下RocketMQ基础之最!
应一些小伙伴们的私信,希望可以介绍一下RocketMQ的基础,那么我们现在就从0开始,进入RocketMQ的基础学习及概念介绍,为学习和使用RocketMQ打好基础! RocketMQ的定位 Rock ...
- 菜鸡的Java笔记 第十九 - java 继承
继承性的主要目的,继承的实现,继承的限制 继承是面向对象中的第二大主要特点,其核心的本质在于:可以将父类的功能一直沿用下去 为什么需要继承? ...