[bzoj4368][IOI2015]boxes纪念品盒_动态规划_单调队列_贪心
bzoj4368 IOI2015 boxes纪念品盒
题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4368
数据范围:略。
题解:
如果在一个最优方案中,一个点$i$是这个人拿东西从左侧走过来的,我们就说这个点是蓝的。
如果是右侧的,就说这个点是红。
我们发现,并不存在三个可以不连续的点,满足红蓝红。
即,一定存在一个点$i$,满足$1\sim i$的点是蓝的,$i + 1\sim n$是红的。
接着我们维护一个$dp$状态:$f_i$,表示从$0$开始,把$1\sim i$都从左侧删掉并且回到原点的最小代价;$g_i$表示右侧的最小代价。
考虑$f$怎么转移?
显然,$f_i = min\{ f_j \} (i-j\le k)+a_i+min(a_i, L - a_i)$。
这个可以用线段树啊树状数组什么的优化。但是因为$n$是$10^7$,所以我们用单调队列即可。
代码:
#include <bits/stdc++.h>
#define setIO(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)
#define N 10000010
using namespace std;
typedef long long ll;
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {
int x = 0;
char c = nc();
while (c < 48) {
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x;
}
int q[N], a[N];
ll dis[N], f[N], g[N];
int main() {
// setIO("box");
int n = rd(), k = rd(), L = rd();
for (int i = 1; i <= n; i ++ ) {
a[i] = rd();
dis[i] = min(a[i], L - a[i]);
}
int head = 1, tail = 0;
q[ ++ tail] = 0;
for (int i = 1; i <= n; i ++ ) {
f[i] = f[q[head]] + a[i] + dis[i];
while (head <= tail && f[i] < f[q[tail]])
tail -- ;
while (head <= tail && i - q[head] >= k) {
head ++ ;
}
q[ ++ tail] = i;
}
head = 1, tail = 0;
q[ ++ tail] = n + 1;
for (int i = n; i; i -- ) {
g[i] = g[q[head]] + L - a[i] + dis[i];
while (head <= tail && g[i] < g[q[tail]]) {
tail -- ;
}
while (head <= tail && q[head] - i >= k) {
head ++ ;
}
q[ ++ tail] = i;
}
// for (int i = 0; i <= n + 1; i ++ ) {
// printf("%d : %lld %lld\n", i, f[i], g[i]);
// }
ll ans = 0x3f3f3f3f3f3f3f3fll;
for (int i = 0; i <= n; i ++ ) {
ans = min(ans, f[i] + g[i + 1]);
}
cout << ans << endl ;
}
[bzoj4368][IOI2015]boxes纪念品盒_动态规划_单调队列_贪心的更多相关文章
- 题解 [BZOJ4368][IOI2015]boxes纪念品盒
题面 解析 可以发现,发纪念品有三种方式: 从左边走再原路返回. 从右边走再原路返回. 走一圈. 注意到,第三种走法最多只会走一次, 因为如果走了多次,那发放的物品数量就会>=\(2k\), 那 ...
- 4368: [IOI2015]boxes纪念品盒
4368: [IOI2015]boxes纪念品盒 链接 分析 链接 代码 #include<bits/stdc++.h> using namespace std; typedef long ...
- IOI2015 boxes纪念品盒
BZOJ 4368: [IOI2015]boxes纪念品盒 BZOJ传送门 Description IOI2015开幕式正在进行最后一个环节.按计划在开幕式期间,每个代表队都将收到由主办方发放的一个装 ...
- [BZOJ] IOI2015 Boxes纪念品盒
问题描述 IOI2015 开幕式正在进行最后一个环节.按计划在开幕式期间,每个代表队都将收到由主办方发放的一个装有纪念品的盒子.然而所有志愿者都被精彩的开幕式所吸引,除 Aman外其他人完全忘记了发放 ...
- BZOJ 4368: [IOI2015]boxes纪念品盒
三种路径,左边出去左边回来,右边出去右边回来,绕一圈 绕一圈的路径最多出现一次 那么绕一圈的路径覆盖的点一定是左边半圈的右边和右边半圈的左边 枚举绕一圈的路径的起始点(一定要枚举,这一步不能贪心),更 ...
- BZOJ 4368: [IOI2015]boxes纪念品盒 贪心
题意:给定一个环,环上有一些点包裹,你要从 $0$ 号点出发,然后每次带上一个容量为 $k$ 的背包. 问:如果要把所有的包裹都带回 $0$ 好点最少要走多少距离. 每一次只有 $3$ 种走法:走整圆 ...
- 【BZOJ2442】修建草坪(动态规划,单调队列)
[BZOJ2442]修建草坪(动态规划,单调队列) 题面 权限题..洛谷 题解 设\(f[i]\)表示前\(i\)个里面选出来的最大值 转移应该比较显然 枚举一个断点的位置,转移一下就好 \(f[i] ...
- 【BZOJ1855】股票交易(动态规划,单调队列)
[BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最 ...
- 【CF1133E】K Balanced Teams(动态规划,单调队列)
[CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...
随机推荐
- surprise库官方文档分析(二):使用预测算法
1.使用预测算法 Surprise提供了一堆内置算法.所有算法都派生自AlgoBase基类,其中实现了一些关键方法(例如predict,fit和test).可以在prediction_algorith ...
- nginx + keepalived双活配置
一.安装nginx 我们这边默认安装的nginx的是1.12.2的版本,所以我们需要安装1.16.1版本的nginx的,才好,所以我们这边先更新yum源,步骤如下: 1.添加yum源: [root@s ...
- MySQL 环比计算
SELECT t.*, CASE WHEN t.SaleDealMoney_last ,) END link_ratio FROM ( SELECT a.my_ym, FORMAT(a.SaleDea ...
- 贴两个mysql优化的配置文件
MySQL5.7以上my.cnf配置文件配置 低配置服务器配置 [client] #客户端设置 port = 3306 socket = /data/mysql/data/mysql.sock def ...
- Cannot initialize a variable of type 'Stu *' with an rvalue of type 'void *'
code: 将 Stu* pStu = malloc(sizeof(Stu)); 改为Stu* pStu = (Stu*)malloc(sizeof(Stu)); code #include < ...
- Linux下基于Xampp的TestLink的安装部署
由于项目需要,故需要搭建Testlink,且出于稳定,考虑在linux环境部署,当然windows系统也是可以的. 系统:64位操作系统 linux:centos6.8 testlink:1.9.14 ...
- can't read property 'push' of undefined
在某些情况下是因为没有初始化,所以初始化一下就好了
- spring boot 之登录笔记
在测试平台的开发中,会牵涉到登录内容,页面需要登录后才能访问,所以,对于登录的开发是很有必要的.本文记录我在系统登录的一些自己的做法. 首先对登录进行设计. 如下: 1.登录密码输入错误超过次数限制 ...
- 【原】Python基础-类
class CPerson: name = "default" __name2 = "inaccessable name" #类作用域内的变量可以被所有实例访问 ...
- Go by Example-流控制语句之if/else
Go by Example-流控制语句之if/else Go中的if/else的用法和其他语言没什么区别,在格式要求上保留了类似Python中的一些特性. 基本概念 在条件判断语法 if/else 中 ...