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纪念品盒_动态规划_单调队列_贪心的更多相关文章

  1. 题解 [BZOJ4368][IOI2015]boxes纪念品盒

    题面 解析 可以发现,发纪念品有三种方式: 从左边走再原路返回. 从右边走再原路返回. 走一圈. 注意到,第三种走法最多只会走一次, 因为如果走了多次,那发放的物品数量就会>=\(2k\), 那 ...

  2. 4368: [IOI2015]boxes纪念品盒

    4368: [IOI2015]boxes纪念品盒 链接 分析 链接 代码 #include<bits/stdc++.h> using namespace std; typedef long ...

  3. IOI2015 boxes纪念品盒

    BZOJ 4368: [IOI2015]boxes纪念品盒 BZOJ传送门 Description IOI2015开幕式正在进行最后一个环节.按计划在开幕式期间,每个代表队都将收到由主办方发放的一个装 ...

  4. [BZOJ] IOI2015 Boxes纪念品盒

    问题描述 IOI2015 开幕式正在进行最后一个环节.按计划在开幕式期间,每个代表队都将收到由主办方发放的一个装有纪念品的盒子.然而所有志愿者都被精彩的开幕式所吸引,除 Aman外其他人完全忘记了发放 ...

  5. BZOJ 4368: [IOI2015]boxes纪念品盒

    三种路径,左边出去左边回来,右边出去右边回来,绕一圈 绕一圈的路径最多出现一次 那么绕一圈的路径覆盖的点一定是左边半圈的右边和右边半圈的左边 枚举绕一圈的路径的起始点(一定要枚举,这一步不能贪心),更 ...

  6. BZOJ 4368: [IOI2015]boxes纪念品盒 贪心

    题意:给定一个环,环上有一些点包裹,你要从 $0$ 号点出发,然后每次带上一个容量为 $k$ 的背包. 问:如果要把所有的包裹都带回 $0$ 好点最少要走多少距离. 每一次只有 $3$ 种走法:走整圆 ...

  7. 【BZOJ2442】修建草坪(动态规划,单调队列)

    [BZOJ2442]修建草坪(动态规划,单调队列) 题面 权限题..洛谷 题解 设\(f[i]\)表示前\(i\)个里面选出来的最大值 转移应该比较显然 枚举一个断点的位置,转移一下就好 \(f[i] ...

  8. 【BZOJ1855】股票交易(动态规划,单调队列)

    [BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最 ...

  9. 【CF1133E】K Balanced Teams(动态规划,单调队列)

    [CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...

随机推荐

  1. 前端武器库之DOM练习

    1.模态对话框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  2. Python3中转换字符串编码

    在使用subprocess调用Windows命令时,遇到了字符串不显示中文的问题,源码如下:#-*-coding:utf-8-*-__author__ = '$USER' #-*-coding:utf ...

  3. 微信小程序设置滚动条

    前言 又很久没有写东西了,上周开始将一个APP和一个网站的内容整合到微信小程序中,到这会儿终于搞得快结束了,才发现为啥我的小程序滚动视图没有滚动条,这是闹哪样,没有滚动条的滚动是没有灵魂的. 客官可移 ...

  4. docker安装单机hadoop

    安装环境 centos7. docker -ce(这个安装参考我的另外一篇博客 首先关闭防火墙 systemctl stop firewalld.service #停止firewall systemc ...

  5. php手记(替代语法、COOKIE及时生效)

    为方便区分流程语句的开始和结束位置,可以使用PHP提供的替代语法进行编码. 左花括号({) - 替换成 → 冒号(:) 右花括号(}) - 替换成 → "endif;" " ...

  6. [GitHub]纪华裕的GitHub收藏

    由于GitHub的star没有分类功能在此写下我的收藏. JS nodenodejs的仓库 puppeteer一个用户测试的无头浏览器 moment日期操作库,包括格式化等

  7. rpm包和deb分别是什么?

    一.RMP 是 LINUX 下的一种软件的可执行程序,你只要安装它就可以了.这种软件安装包通常是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀 ...

  8. win10 sedlauncher.exe占用cpu处理

    打开应用和功能,搜KB4023057,然后卸载. 打开系统服务,找到Windows Remediation Service (sedsvc)和Windows Update Medic Service ...

  9. 【Python】把文件名命名成canlendar.py竟然导致无法使用canlendar模块 附赠2020年月历

    这个bug困扰了我一阵,直到在 http://www.codingke.com/question/15489 找到了解决问题的钥匙,真是没想到居然是这个原因导致的. 下面是出错信息,可以看到只要目录下 ...

  10. (32位汇编 五)mov/add/sub/and/or/xor/not

    本文链接:https://blog.csdn.net/pl20140910/article/details/78227133说明符号 说明r 通用寄存器m 代表内存imm 代表立即数r8 代表8位通用 ...