当前位置: 首页 > news >正文

37 ACwing 298 Fence 题解

Fence

题面

有 N 块木板从左到右排成一行,有 M 个工匠对这些木板进行粉刷,每块木板至多被粉刷一次。

第 i 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 的,长度不超过 \(L_i\) 的连续的一段木板,每粉刷一块可以得到 \(P_i\) 的报酬。

\(1 \le N \le 16000\)

\(1 \le M \le 100\)

\(1 \le P_i \le 10000\)

题解

这道题要考虑每个工匠刷了哪个区间的木板,然后从前面一个工匠转移到下一个工匠

我们先将所有工匠按照 \(S_i\) 排序,保证无后效性,当前状态都是由已知的状态转移过来的

\(f(i,j)\) 表示前 \(i\) 个工匠刷前 \(j\) 个木板的最大价值

有以下转移

  • \(i\) 个工人不刷:\(f(i,j) = f(i - 1, j)\)

  • \(i\) 个工人不刷第 \(j\) 块木板:\(f(i,j) = f(i, j - 1)\)

  • \(i\) 个工人刷第 \(k + 1 \sim i\) 块木板: \(f(i,j) = \max_{j - L_i \le k \le S_i - 1} \{ f(i - 1, k) + (i - k) \times P_i \}\)

第三个转移的时间复杂度为 \(O(N)\) ,想想怎么优化?

第三个转移的难点在于求区间最大值,而且随着 \(j\) 变大,左边界变大,右边界不变,所以看看能不能用单调队列优化

\(\max\) 内的已知项移出来 \(f(i,j) = \max_{j - L_i \le k \le S_i - 1} \{ f(i - 1, k) - k \times P_i \} + i * P_i\)

发现 $\max $ 内的式子只和 \(k\) 有关,所以我们可以维护一个决策点 \(k\) 单调递增,\(f(i - 1, k) - k \times P_i\) 单调递减的队列

然后进行转移即可

code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>using namespace std;const int N = 1.6e4 + 10, M = 110;int n, m;
int q[N], f[M][N];
struct worker {int l, p, s;bool operator < (const worker & t) const {return s < t.s;}
} a[M];int calc (int i, int k) {return f[i - 1][k] - k * a[i].p;
}int main () {cin >> n >> m;for (int i = 1; i <= m; i ++) {scanf ("%d%d%d", &a[i].l, &a[i].p, &a[i].s);}sort (a + 1, a + 1 + m);for (int i = 1; i <= m; i ++) {int h = 1, t = 0;for (int k = max (0, a[i].s - a[i].l); k <= a[i].s - 1; k ++) {while (h <= t && calc (i, q[t]) <= calc (i, k)) t --;q[ ++ t] = k;}for (int j = 1; j <= n; j ++) {//不刷 jf[i][j] = max (f[i - 1][j], f[i][j - 1]);if (j >= a[i].s) {while (h <= t && q[h] < j - a[i].l) h ++;if (h <= t) f[i][j] = max (f[i][j], calc (i, q[h]) + j * a[i].p);}}}cout << f[m][n] << endl;return 0;
}
http://www.hskmm.com/?act=detail&tid=27584

相关文章:

  • 35 ACwing 297 The Battle Chibi 题解
  • 一款由网易出品的免费、低延迟、专业的远程控制软件,支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑!
  • 计划管理
  • 苍穹外卖第二天(Nginx如何配置、MD5加密)
  • aardio跨窗口传递变量
  • AI在简单视觉推理谜题中的挑战
  • 自动引入的element-plus覆盖tailwindcss样式冲突解决方法
  • 已严肃完成今日96种状态的超级神仙DP大学习
  • P3388 【模板】割点(割顶) tarjan
  • new day
  • 10.9每日总结
  • vLLM 吞吐量优化实战:10个KV-Cache调优方法让tokens/sec翻倍
  • Linux之周期性定时任务实践
  • MyBatis-Plus 的 QueryWrapper 应用以及在内存中处理JSON数组字符串匹配
  • P9461 「EZEC-14」众数 II
  • 提升
  • 详细介绍:win11 安装 WSL2 Ubuntu 并支持远程 SSH 登录
  • Ai元人文:论智能的“全息定帧”与“渐进式显影”机制
  • 24 LCA模拟赛2T4 colorful 题解
  • 23 LCA模拟赛2T2 异或排列 题解
  • Bugkuctf的哥哥的秘密
  • 国庆做题记录(基础算法)
  • fp16训练神经网络时出现nan问题
  • 第十篇
  • 504 品酒大会!!!!!!
  • 整体理解pai0-具身智能-01 - jack
  • 【数据结构】可撤销并查集 - Slayer
  • 皮卡鱼源码导读
  • 高斯消元学习笔记
  • newDay07