【Codeforces Round #466】E. Cashback DP+ST表
题意
给定$n$个数,将其划分成若干个连续的子序列,求最小价值,数组价值定义为,数组和减去$\lfloor \frac{k}{c} \rfloor$,$k$为数组长度,$c$为给定数
可以列得朴素方程$f_i=\min_{j \le i} {f_j+w(j+1,i)}$,复杂度$O(n^2)$
考虑划分的区间长度$k$,若$k=c$,那么只需要去掉区间的最小值,若$k$是$c$的整数倍,那么需要去掉$k/c$个最小值,那么把$k$分成$k/c$个长度为$c$的段,删除的最小值为每个段的最小值之和一定不小于长度为$k$的段的$k/c$个最小值的和,所以最优的分段一定是分成若干个长度为$c$的段
在考虑$k$不被整除的情况,若$k=c+p,p < k$,那么这一段也只会删掉一个最小值,随着$p$的增大,最小值单调不增,所以不会更优。若$k<c$,那么将不会删除值,也就是代价不会转移,可以将其看成分成$k$个$1$
所以可以将方程化简为$f_i=\min {f_{i-1},f_{i-c}+u(j+1,i) }$ ,$u(i,j)$为$[i,j]$的区间和减去区间最小值,可以利用st表预处理得到
时间复杂度$O(n\log n)$
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int n, c, a[100005], st[100005][35];
LL dp[100005], sum;
int min_(int l, int r) {int x = (int)(log(double(r - l + 1)) / log(2.0));return min(st[l][x], st[r - (1 << x) + 1][x]);
}
int main() {scanf("%d%d", &n, &c);for(int i = 1; i <= n; ++i) {scanf("%d", &a[i]); st[i][0] = a[i]; sum += a[i];}for(int j = 1; (1 << j) <= n; ++j) {for(int i = 1; i + (1 << j - 1) <= n; ++i) {st[i][j] = min(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);}}for(int i = c; i <= n; ++i) {dp[i] = max(dp[i - 1], dp[i - c] + min_(i - c + 1, i));}cout << sum - dp[n] << endl;return 0;
}
转载于:https://www.cnblogs.com/ogiso-setsuna/p/8497088.html
【Codeforces Round #466】E. Cashback DP+ST表相关推荐
- Codeforces Round#466 E. Cashback
题目: http://codeforces.com/contest/940/problem/E 题意: 给一串数,能把它分成连续的几段,每段有一个分值,求分值和最小能为多少; 分值计算方法:假设这段有 ...
- CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的数组 aaa,下标从 000 开始,每次操作分为两个步骤: 构建出数组 bbb,有 bi=gcd(ai,a(i+1)modn)b_i=gcd(a ...
- Codeforces 359D Pair of Numbers | 二分+ST表+gcd
题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...
- Codeforces Round #466 (Div. 2): E. Cashback(单调队列+DP)
题目链接:http://codeforces.com/contest/940/problem/E 题意:给你一个长为n的序列和一个数字c,你要将这个序列切成若干段,对于每一段,这段中最小的[n/c]个 ...
- Codeforces Round #466 (Div. 2)
http://codeforces.com/contest/940 A水题 //#pragma comment(linker, "/stack:200000000") //#pra ...
- Codeforces Round #736 (Div. 2) D. Integers Have Friends ST表gcd + 尺取
传送门 文章目录 题意: 思路: 题意: 给你一个序列aaa,求一个最长的子序列[l,r][l,r][l,r]满足aimodm=ai+1modm=...=armodma_i\bmod m=a_{i+1 ...
- Codeforces Round #594 (Div. 2) C. Ivan the Fool and the Probability Theory 思维 + dp
文章目录 题意: 思路 题意: 思路 一开始找规律,表都打好了,没找出来.. 找规律还是适合让队友来. 先考虑第一行,我们先计算第一行的方案数,设f[i][j]f[i][j]f[i][j]表示到了ii ...
- Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环
传送门 文章目录 题意: 思路: 题意: 思路: 首先我们知道如果所有数的和summodk!=0sum\bmod k!=0summodk!=0那么此时无解,否则我们设need=sum/kneed=su ...
- Codeforces Round #627 (Div. 3) E. Sleeping Schedule dp
传送门 文章目录 题意: 思路: 题意: 给你一天hhh小时,初始时间是000,每天可以使时间+ai+a_i+ai或者+ai−1+a_i-1+ai−1,问最多可以让多少天的时间在[l,r][l,r ...
最新文章
- 银行柜台基金买卖现长龙 业内支招宜用新方式
- 第1章 Java语言概述
- 滨海宣传员——青龙羊毛
- Hibernate的dynamic-insert和dynamic-update的使用
- 关于UI Automation框架
- explain 之 id
- c# Invoke和BeginInvoke 区别详解
- @RequestParam注解使用
- Python报错:PermissionError: [Errno 13] Permission denied 解决方案详解
- python内置函数map_Python内置函数(34)——map
- 点至直线的距离和垂足点计算
- docker容器的使用
- Android WebView 调用相机、相册,压缩图片后上传
- Java基础系列:判断空指针的三种方式
- NOIP2015 pj
- 数据结构与算法--散列表
- linux服务器好管理吗,给初学者Linux服务器管理建议
- 化妆品展示网页设计作业 静态HTML化妆品网站 DW美妆网站模板下载 大学生简单网页作品代码 个人网页制作 学生个人网页设计作业
- 干货 | 机器学习模型在携程海外酒店推荐场景中的应用
- kingview3d在楼宇行业的应用