题目描述

Since you are the best Wraith King, Nizhniy Magazin «Mir» at the centre of Vinnytsia is offering you a discount.

You are given an array a a a of length n n n and an integer c c c .

The value of some array b b b of length k k k is the sum of its elements except for the smallest. For example, the value of the array [3,1,6,5,2] [3,1,6,5,2] [3,1,6,5,2] with c=2 c=2 c=2 is 3+6+5=14 3+6+5=14 3+6+5=14 .

Among all possible partitions of a a a into contiguous subarrays output the smallest possible sum of the values of these subarrays.

输入格式

The first line contains integers n n n and c c c ( 1<=n,c<=100000 1<=n,c<=100000 1<=n,c<=100000 ).

The second line contains n n n integers ai a_{i} ai​ ( 1<=ai<=109 1<=a_{i}<=10^{9} 1<=ai​<=109 ) — elements of a a a .

输出格式

Output a single integer — the smallest possible sum of values of these subarrays of some partition of a a a .

题意翻译

给你一个长度为n的数列a和整数c

你需要把它任意分段

每一段假设长度为k,就去掉前\(\lfloor\frac{k}{c}\rfloor\) 小的数

最小化剩下的数的和

输入输出样例

输入 #1

3 5

1 2 3

输出 #1

6

输入 #2

12 10

1 1 10 10 10 10 10 10 9 10 10 10

输出 #2

92

输入 #3

7 2

2 3 6 4 5 7 1

输出 #3

17

输入 #4

8 4

1 3 4 5 5 3 4 1

输出 #4

23

说明/提示

In the first example any partition yields 6 as the sum.

In the second example one of the optimal partitions is [1,1],[10,10,10,10,10,10,9,10,10,10] [1,1],[10,10,10,10,10,10,9,10,10,10] [1,1],[10,10,10,10,10,10,9,10,10,10] with the values 2 and 90 respectively.

In the third example one of the optimal partitions is [2,3],[6,4,5,7],[1] [2,3],[6,4,5,7],[1] [2,3],[6,4,5,7],[1] with the values 3, 13 and 1 respectively.

In the fourth example one of the optimal partitions is [1],[3,4,5,5,3,4],[1] [1],[3,4,5,5,3,4],[1] [1],[3,4,5,5,3,4],[1] with the values 1, 21 and 1 respectively.

分析

首先,因为要最小化剩下的数的和,那么我们肯定要使取走的数的总和尽可能大

我们还可以发现,因为要去掉前\(\lfloor\frac{k}{c}\rfloor\) 小的数

因此只有一段区间的长度大于等于\(c\)时才会对结果产生贡献

而且我们划分出长度为\(k\times c + m (1\leq m < c)\)的区间一定不如划分出长度为\(k\times c\)的区间更优

因为这两种情况选出的数字的数量相同,但是在第二种情况中选出数的最小值一定不会比前一种情况更小

但是这样写还是不太好处理,因为要涉及到前\(k\)小的数,所以似乎要用到某些高级数据结构

而这样显然是不好处理的

我们进一步推导会发现,将一个长度为\(k\times c\)的区间划分为\(k\)个长度为\(c\)的区间所产生的结果只会更优

比如下面一个长度为\(8\)的序列,\(c=4\)

\(1、 1 、2 、5 、3 、7、 8、 9\)

如果我们把它划分为长度为\(8\)的序列,那么产生的贡献为\(1+1=2\)

但是如果我们把它分成两个长度为\(4\)的序列

\(1、1、2、5\)和\(3、7 、8、9\)

那么产生的贡献为\(1+3=4\)

显然后一种更优

因此,我们将原题进一步转换成将一个长度为\(n\)的序列划分为若干长度为\(c\)的序列,使每一个序列的最小值之和最大

其中区间最值可以用线段树去维护

那么我们可以写出如下的状态转移方程

    for(int i=1;i<=n;i++){
f[i]=max(f[i],f[i-1]);
if(i>=c) f[i]=max(f[i],f[i-c]+(long long)jl[i]);
}

其中\(f[i]\)表示以遍历到下标为\(i\)的元素所选出的最大价值

\(jl[i]\)表示以\(a[i]\)结尾的长度为\(c\)的区间中的最小值

如果我们选取以\(a[i]\)结尾的长度为\(c\)的区间,那么\(f[i]=max(f[i],f[i-c]+(long long)jl[i]\)

否则\(f[i]=max(f[i],f[i-1])\)

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
struct trr{
int l,r,mmin;
}tr[maxn<<2];
void push_up(int da){
tr[da].mmin=min(tr[da<<1].mmin,tr[da<<1|1].mmin);
}
void build(int da,int l,int r){
tr[da].l=l,tr[da].r=r;
if(l==r){
tr[da].mmin=a[l];
return;
}
int mids=(l+r)>>1;
build(da<<1,l,mids);
build(da<<1|1,mids+1,r);
push_up(da);
}
int cx(int da,int l,int r){
if(tr[da].l>=l && tr[da].r<=r){
return tr[da].mmin;
}
int ans=0x3f3f3f3f,mids=(tr[da].l+tr[da].r)>>1;
if(l<=mids) ans=min(ans,cx(da<<1,l,r));
if(r>mids) ans=min(ans,cx(da<<1|1,l,r));
return ans;
}
int jl[maxn];
long long f[maxn];
int main(){
long long tot=0;
int n,c;
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
tot+=(long long)a[i];
}
build(1,1,n);
long long ans=0;
for(int i=1;i<=n-c+1;i++){
jl[i+c-1]=cx(1,i,i+c-1);
}
for(int i=1;i<=n;i++){
f[i]=max(f[i],f[i-1]);
if(i>=c) f[i]=max(f[i],f[i-c]+(long long)jl[i]);
}
printf("%lld\n",tot-f[n]);
return 0;
}

CF940E Cashback 线段树优化DP的更多相关文章

  1. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  2. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  3. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  4. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

  5. POJ 2376 Cleaning Shifts (线段树优化DP)

    题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...

  6. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  7. D - The Bakery CodeForces - 834D 线段树优化dp···

    D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...

  8. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

  9. Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...

随机推荐

  1. JMeter+Grafana+Influxdb搭建可视化性能测试监控平台(使用了docker)

    [运行自定义镜像搭建监控平台] 继上一篇的帖子 ,上一篇已经展示了如何自定义docker镜像,大家操作就行 或者 用我已经自定义好了的镜像,直接pull就行 下面我简单介绍pull下来后如何使用 拉取 ...

  2. JMETER学习宝典

    1. 简介 Apache JMeter是100%纯java桌面应用程序,被设计用来测试客户端/服务器结构的软件(例如web应用程序).它可以用来测试包括基于静态和动态资源程序的性能,例如静态文件,Ja ...

  3. 调用php命令出错

    调用php -v命令.php artisan route:list等命令均出现一下错误. MIB search path: c:/usr/share/snmp/mibsCannot find modu ...

  4. Python 简明教程 --- 19,Python 类与对象

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 那些能用计算机迅速解决的问题,就别用手做了. -- Tom Duff 目录 上一节 我们介绍了Pyt ...

  5. 入门大数据---Hive分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  6. vue全家桶(4.3)

    5.3.Vuex的核心概念 store: 每一个 Vuex 应用的核心就是 store(仓库)."store"基本上就是一个容器,它包含着你的应用中大部分的状态 (state) s ...

  7. Nginx详细介绍

    1.Nginx是什么? Nginx就是反向代理服务器. 首先我们先来看看什么是代理服务器,代理服务器一般是指局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端.比如Go ...

  8. Js中各种类型的变量在if条件中是true还是false

    如果操作数是一个对象,返回true如果操作数是一个空字符串,返回false如果操作数是一个非空字符串,返回true如果操作数是数值0,返回false如果操作数是任意非0数值(包括Infinity),返 ...

  9. 痞子衡嵌入式:kFlashFile v1.0 - 一个基于Flash的掉电数据存取方案

    大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的个人小项目 - kFlashFile. 痞子衡最近在参与一个基于 i.MXRT1170 的项目,项目有个需求,需要在 Flash 里实 ...

  10. 什么是JSTL标签库?

    什么是JSTL? JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的. 有什么作用? ...