bzoj2442(单调队列优化)
来源:互联网 发布:mac单引号怎么打出来 编辑:程序博客网 时间:2024/05/01 06:01
我们很容易想到nk的做法:
定义f[i]为前i个数这样分的方法
那么转移为
改成前缀和
若一个点比另一个优,(设k比j优),那么f[k - 2] + sum[i] - sum[k - 1] > f[j - 2] + sum[i] - sum[j - 1], 即f[k - 2] - sum[k - 1] > f[j - 2] - sum[j - 1]。我们用单调队列维护就好
一开始把while写成if调了半天,QAQ
#include<cstdio>#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cmath>const int N = 1e5 + 10;int n, k, head = 1, tail = 1;long long sum[N], f[N];struct item { int id; long long data; item () {} item (int id, long long data) : id (id), data (data) {} bool operator >= (const item &rhs) const { return data >= rhs.data; }}q[N], hel;int main () { scanf ("%d%d", &n, &k); q[1] = item (1, 0); for (int i = 1; i <= n; ++i) { scanf ("%lld", sum + i); sum[i] += sum[i - 1]; if (i >= 2) { hel = item (i, f[i - 2] - sum[i - 1]); while (head <= tail && hel >= q[tail]) --tail; q[++tail] = hel; } while (head <= tail && i - k + 1 > q[head].id) ++head; f[i] = std :: max (q[head].data + sum[i], f[i - 1]); } printf ("%lld\n", f[n]); return 0;}
1 0
- bzoj2442(单调队列优化)
- bzoj2442: [Usaco2011 Open]修剪草坪(单调队列优化dp)
- 【codevs4654】【BZOJ2442】修剪草坪,第一次的单调队列,优化DP
- bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
- 【bzoj2442】【Usaco2011 Open】修剪草坪【dp+单调队列】
- BZOJ2442 [Usaco2011 Open]修剪草坪 (DP+单调队列)
- [codevs4654][bzoj2442]修剪草坪(单调队列dp)
- 单调队列优化DP
- 单调队列优化DP
- 单调队列优化专题
- poj1821 单调队列优化
- ##单调队列、斜率优化##
- dp单调队列优化
- 单调队列优化LIS
- 单调队列--优化dp
- 单调队列优化dp
- 单调队列优化DP
- 单调队列优化DP
- 将数组A中的内容和数组B中的内容进行交换。(数组一样大)
- #166 Nth to Last Node in List
- Ubuntu14.04 运行程序错误,调试记录
- 最全的HTTP头部信息分析
- 本地存储SessionStorage
- bzoj2442(单调队列优化)
- C语言语法补漏
- 打开/dev/ttyUSB0 权限不够
- 常用的DOS命令
- openfire后台拿shell与myeclipse编译插件
- CentOS6.4下源码安装MySQL5.6.15
- sed 处理文本的用法
- 学习
- Android ComponentName简介