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 ;
}

最新文章

  1. ReactJS基础视频教程
  2. html5实现摇一摇功能
  3. 深入理解PHP内核(十一)函数-函数的内部结构
  4. OpenCV成长之路(3):模仿PhotoShop中魔术棒工具
  5. Matlab中的数据类型
  6. 【ZZ】常用推荐算法
  7. Android Adapter的getViewTypeCount和getItemViewType
  8. ios解析XML和json数据
  9. 一元多项式Polynomial的C语言实现
  10. 配置Delphi工具菜单 转
  11. Spark 初级算子
  12. Spring MVC整体处理流程
  13. 开放搜索服务OpenSearch
  14. T-SQL语句中的转换函数
  15. SOA和微服务架构
  16. Web 性能优化:Preload与Prefetch的使用及在 Chrome 中的优先级
  17. 进程初识和multiprocessing模块之Process
  18. SQL Server创建存储过程——动态SQL
  19. display:table-cell几种应用
  20. Omi教程-组件通讯攻略大全

热门文章

  1. 二维bit模板
  2. P3066 [USACO12DEC] 逃跑的Barn 左偏树
  3. Bzoj 1566: [NOI2009]管道取珠(DP)
  4. Ansible管理上千台主机时需要的速度优化
  5. vue tab嵌入iframe切换不刷新,相对完整的方案
  6. LeetCode 第 150 场周赛
  7. Java核心复习——synchronized
  8. Spring框架中不同类型的事件
  9. C++的面向对象的Dijkstra写法
  10. 2018-2019-2 网络对抗技术 20165231 Exp7 网络欺诈防范