Codeforces 940E: Cashback 单调队列优化DP
传送门
题目描述
给你一个长度为n的数列a和整数c
你需要把它任意分段
每一段假设长度为k,就去掉前 ⌊kc⌋\lfloor\frac{k}{c}\rfloor⌊ck⌋小的数
最小化剩下的数的和
分析
我们可以把每一个长度为k的区间删减掉一个最小值,也可以把每一个数单独拆出来不进行删除,所以很容易写出状态方程
f[i] = min(f[i - 1] + a[I],f[i - m] + sum[I] - sum[i - m] - min[i - m + 1 ~i])
最小值可以用单调队列或者线段树来维护
代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#pragma GCC option("arch=native","tune=native","no-zero-upper")
#pragma GCC target("avx2")
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10;
int n,m;
ll a[N];
ll sum[N];
ll f[N];
struct node{int l,r;ll v;
}tr[N * 5];void pushup(int u){ //子节点信息更新父节点tr[u].v = min(tr[u << 1].v,tr[u << 1 | 1].v);
}void build(int u,int l,int r){tr[u] = {l,r};if(l == r) {tr[u].v = a[l];return;}int mid = l + r >> 1;build(u << 1,l,mid),build(u << 1 | 1,mid + 1,r);pushup(u);
}int query(int u,int l,int r){if(tr[u].l >= l && tr[u].r <= r) return tr[u].v;int mid = tr[u].l + tr[u].r >> 1;int v = INF;if(l <= mid) v = query(u << 1,l,r);if(r > mid) v = min(v,query(u << 1 | 1,l,r));return v;
}int main(){scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++) {scanf("%lld",&a[i]);sum[i] = sum[i - 1] + a[i];}build(1,1,n);for(int i = 1;i <= n;i++){f[i] = f[i - 1] + a[i];if(i < m) continue;f[i] = min(f[i],f[i - m] + sum[i] - sum[i - m] - query(1,i - m + 1,i));}printf("%lld\n",f[n]);return 0;
}/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
Codeforces 940E: Cashback 单调队列优化DP相关推荐
- 算法笔记--单调队列优化dp
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...
- poj 2373(单调队列优化dp)
在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...
- poj 1821(单调队列优化dp)
题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)
题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- POJ 1821 Fence(单调队列优化DP)
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...
- 【单调队列优化DP】烽火传递 LibreOJ - 10180
题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...
- AcWing 1089 烽火传递 题解(动态规划—DP—单调队列优化DP)
AcWing 1089 烽火传递 单调队列优化DP,思路比较简单,维护一个保持元素单调递增的单调队列,队首就是第i座烽火台能接收到的,代价最小的方案,加上第i座烽火台的代价就是这座烽火台的最小值 #i ...
最新文章
- ajax局部刷新后,如何让局部中的百度分享重新加载
- Column 'Column Name' does not belong to table Table
- SAP库存解析(MC.9)
- redistemplate set方法_spring boot整合redis ---- RedisTemplate 三分钟快速入门
- java pid 获取句柄_获取进程pid、根据进程pid获取线程pid、获取线程进程句柄
- Qt工作笔记-QMap查找时要注意的问题(使用contains)
- Bootstrap中的网格系统
- 一些个开源网站的搜集和整理——待续
- win10升级助手_Win10系统易升如何彻底关闭?「系统天地」
- 计算机用户名改成英文,win10如何把用户名改成英文
- 公司IT管理制度——案例分享
- Modbus驱动库—libmodbus驱动库的使用
- MongoDB双机热备份
- 各类光纤接口类型的区别与图示
- CCF CSP20190301小中大(100分)(python)
- argument 1 must be str, not PosixPath
- 软件开发测试男友花束,观察这四束花束凭直觉选一束花?测一测别人都在羡慕你的什么?...
- JVM系列-第4章-虚拟机栈
- 202130310164
- 运行快应用rpk文件只需要3分钟4个步骤?