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的更多相关文章

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

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

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

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

  3. CF 868 F. Yet Another Minimization Problem

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

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

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

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

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

  6. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  7. 洛谷CF868F Yet Another Minimization Problem(动态规划,决策单调性,分治)

    洛谷题目传送门 貌似做所有的DP题都要先搞出暴力式子,再往正解上靠... 设\(f_{i,j}\)为前\(i\)个数分\(j\)段的最小花费,\(w_{l,r}\)为\([l,r]\)全在一段的费用. ...

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

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

  9. Codeforces 868F. Yet Another Minimization Problem

    Description 给出一个长度为 \(n\) 的序列,你需要将它分为 \(k\) 段,使得每一段的价值和最小,每一段的价值是这一段内相同的数的个数 题面 Solution 容易想到设 \(f[i ...

随机推荐

  1. 初学python-day5 流程控制

    流程控制 一.判断语句 1.if语句(单一条件分支) 结构: if    表达式: 为真的时候执行的语句 概述:当程序运行到if语句时候,首页要计算表达式的值,判断真假,如果表达式的职位为真,则执行i ...

  2. JavaScript03

    类型转换和运算符 typeof函数 检测数据类型,可以使用以下两种调用的方式: typeof 变量或表达式 typeof(变量或表达式) var n="asda"; console ...

  3. Java:LinkedList类小记

    Java:LinkedList类小记 对 Java 中的 LinkedList类,做一个微不足道的小小小小记 概述 java.util.LinkedList 集合数据存储的结构是循环双向链表结构.方便 ...

  4. netty传输java bean对象

    在上一篇博客(netty入门实现简单的echo程序)中,我们知道了如何使用netty发送一个简单的消息,但是这远远是不够的.在这篇博客中,我们来使用netty发送一个java bean对象的消息,但是 ...

  5. FastAPI 学习之路(五十六)将token存放在redis

    在之前的文章中,FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2,FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2,Fa ...

  6. 零基础学习C语言字符串操作总结大全

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

  7. C语言零基础入门难发愁,那就快来看看这篇基础整理资料吧

    C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,使小伙伴对c语言有个初步认识. 例1:计算两个整数之和的c程序: #include main() { in ...

  8. 计算机网络之应用层概述(C/S模型与p2p模型)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105582318 学习课程:<2019王道考研计算机网络> 学习目的 ...

  9. error: unsupported reloc 43

    在Ubuntu 16.04.5 LTS编译android 5.1报错 [19:17:13.062]libnativehelper/JniInvocation.cpp:165: error: unsup ...

  10. Java多线程| 01 | 线程概述

    Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...