1 题目大意

1.1 题目翻译

有两个人轮流取物品。总共有 \(n\) 个物品,第 \(i\) 个物品的价值为 \(w_i\)。

他们按照下面的其中一种方式取物品:

  • 取出这一排物品最前面的或者最后面的。这一步没有代价。

  • 设还剩下 \(m\) 个物品,那么重复取出 \(\min(B, m)\) 个物品,每次取出最前面的或者最后面的。这一步的代价为 \(A\)。

  • 设还剩下 \(m\) 个物品,那么重复取出 \(\min(D, m)\) 个物品,每次取出最前面的或者最后面的。这一步的代价为 \(B\)。

最后一个人取出物品的价值为所有他取出物品价值之和减去他所花费的代价。问当两人均以最优策略取物品时,先手取出物品的价值减去后手取出物品的价值为多少。

1.2 数据范围

对于 \(100\%\) 的数据:

  • \(1 \leq B, D \leq n \leq 3000\)

  • \(A, C \leq 10 ^ 9\)

2 解法分析

2.1 初见此题

首先,一看这道题,我们就会发现:不管怎么取物品,任何时刻的序列一定是原序列的一段连续子区间。所以,我们不难想到区间 DP。

2.2 暴力 DP

设 \(f_{i, j}\) 表示当前序列为原序列从第 \(i\) 个到第 \(j\) 个元素时,答案的最大值。那么,会有 \(3\) 种情况:

  • 操作 1。此时,\(f_{i,j} = \max(w_i - f_{i + 1, j}, w_j - f_{i, j - 1})\)

  • 操作 2。设 \(l = j - i + 1\),则:

    • 当 \(B \geq l\) 时:
    \[f_{i, j} = (\sum_{i \leq k \leq j}w_k) - A
    \]
    • 当 \(B < l\) 时:
    \[f_{i, j} = \max_{0 \leq k \leq l}\{(\sum_{i \leq p \leq i + k - 1} w_p) + (\sum_{j - B + k + 1 \leq p \leq j}w_p) - C - f_{i + k, j - B + k}\}
    \]
  • 操作 3。大致与操作 2 相同,这里就不过多叙述。

至此,我们完成了暴力 DP,时间复杂度为 \(\mathcal{O}(n^3)\),显然过不了。

所以,接下来,我们就要考虑优化。

2.3 DP 优化

观察 DP 方程。我们发现,极限复杂度只出现在了操作 2 当 \(B < l\) 的情况。所以,我们把这个式子的 \(\max\) 去掉,得:

\[(\sum_{i \leq p \leq i + k - 1} w_p) + (\sum_{j - B + k + 1 \leq p \leq j}w_p) - C - f_{i + k, j - B + k}
\]

我们发现,\((\sum_{i \leq p \leq i + k - 1} w_p) + (\sum_{j - B + k + 1 \leq p \leq j}w_p)\) 可以前缀和 \(\mathcal{O}(1)\) 计算。设 \(s_{l, r}\) 为 \(l\) 到 \(r\) 的物品价值之和,于是得:

\[- s_{i + k, j - B + k} - f_{i + k, j - B + k} - C + s_{i, j}
\]

观察这个方程。我们把 \(k\) 视为未知数,\(i, j\) 视为常数,则 \(s_{i,j} - C\) 为常数,可以提到 \(\max\) 外面。所以,我们需要维护的只有:

\[s_{i + k, j - B + k} + f_{i + k, j - B + k}
\]

发现这两个区间的长度都是 \((j - B + k) - (i + k) = j - i - B\),那么相当于只需要维护长度为 \(x\) 的 \(f_{i, i + x - 1} + s_{i, i + x - 1}\) 中最小的一个即可。

这有许多维护方法,比如优先队列,线段树,ST 表。

至此,这道题就完成了。时间复杂度为 \(\mathcal{O}(n^2)\) 或者 \(\mathcal{O}(n^2\log{n})\)

[ABC303G] Bags Game 解题分析的更多相关文章

  1. [rctf](web)rcdn 解题分析,知识点总结

    比赛平台关闭了,没有截图,见谅.   解题思路流程: 分析网站结构,看源码,元素审计.发现以下信息. 要得到flag要获得一个pro cdn pro 子域名长度为3到6个字符 存在一个提交ticke页 ...

  2. codeforces 723E (欧拉回路)

    Problem One-Way Reform 题目大意 给一张n个点,m条边的无向图,要求给每条边定一个方向,使得最多的点入度等于出度,要求输出方案. 解题分析 最多点的数量就是入度为偶数的点. 将入 ...

  3. codeforces716E (点分治)

    Problem Digit Tree 题目大意 给一棵树,有边权1~9. 询问有多少个点对(i,j),将i--j路径上的数字依次连接后所形成新数字可以被k整除.gcd(K,10)=1 解题分析 点分治 ...

  4. poj1741 (点分治)

    Problem Tree 题目大意 给一棵树,有边权.求树上距离小于等于K的点对有多少. 解题分析 点分治.对每一棵子树进行dfs,求出每棵子树的重心,继而转化为子问题. 对于经过根的路径i--j,令 ...

  5. HDU 5884 (贪心)

    problem sort 题目大意 有n个数组,每个数组有a[i]个元素,每次可以将至多k个数组合并为一个数组,所花费代价为这些数组的元素和.给定代价上限,求将所有数组合并为1个数组的最小k. 解题分 ...

  6. codeforces 341d (树状数组)

    problem Iahub and Xors 题目大意 一个n*n的矩阵,要求支持两种操作. 操作1:将一个子矩阵的所有值异或某个数. 操作2:询问某个子矩阵的所以值的异或和. 解题分析 由于异或的特 ...

  7. HDU 5869 (离线+树状数组)

    Problem Different GCD Subarray Query 题目大意 给定n个数的序列,有q个询问,每次询问一个区间中所有子区间所形成不同的gcd的数量. 解题分析 由于固定一个数为右端 ...

  8. HDU5840 (分块+树链剖分)

    Problem This world need more Zhu 题目大意 给一颗n个点的有点权的树,有m个询问,对于每个询问u,v,k,首先将点u到点v的最短路径上的所有点按顺序编号,u的编号为1, ...

  9. HDU 5398 (动态树)

    Problem GCD Tree 题目大意 n个点的无向完全图,标号1~n,每条边u-->v 的权值为gcd(u,v),求其最大生成树,输出最大边权和. n<=10^5,有多个询问. 解题 ...

  10. BZOJ3669 (动态树)

    Problem 魔法森林 (NOI2014) 题目大意 给n个点,m条边的无向图,每条边有两个权值a,b. 求一条从1-->n的路径,使得这条路径上max(a)+max(b)最小.输出最小值即可 ...

随机推荐

  1. MCP 实践系列:百度 AI 搜索

    今天在腾讯云MCP市场,我发现了许多不同的MCP组件.接下来,我打算逐一深入了解每个组件的具体功能.今天的重点将是百度AI搜索. 百度AI搜索结合了百度的传统搜索和人工智能技术,能让用户体验到更智能的 ...

  2. BP算法完整推导 2.0 (上)

    前面的笔记已经把 BP算法给推导了, 那4大公式, 核心就是 求偏导数的链式法则, 这篇, 再来跟着大佬来推一波, 目的是为了加深印象. 关于记忆这个话题, 心理学家,其实早已经给出了答案, 最好的记 ...

  3. Pytorch之线性回归

    从零开始实现 %matplotlib inline import torch import numpy as np import random 生成数据集 设训练数据集样本数为1000,特征数为2,使 ...

  4. Win32汇编学习笔记11.游戏辅助的实现

    Win32汇编学习笔记11.游戏辅助的实现-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 游戏基址 游戏基址的概念 游戏基址是保持恒定的两部分内存地址的一部分并提 ...

  5. 【Spring Boot】ActiveMQ 发布/订阅消息模式介绍

    本文在<Spring Boot 整合 JMS(Active MQ 实现)>的基础上,介绍如何使用ActiveMQ的发布/订阅消息模式.发布/订阅消息模式是消息发送者发送消息到主题(topi ...

  6. Krita的语言选项里没有中文

    sudo apt install krita-l10n 即可,

  7. 洛谷 P6626 [省选联考 2020 B 卷] 消息传递

    洛谷 P6626 [省选联考 2020 B 卷] 消息传递 Problem 原题传送门 给一棵有\(n\)个节点的树.有\(m\)个询问,每次给出一对\(x,k\)表示查询到点\(x\)的距离为\(k ...

  8. CSP-S 2020模拟训练题1-信友队T2 挑战NPC

    题意简述 有一个\(k\)维空间,每维的跨度为\(L\),即每一维的坐标只能是\(0,1, \cdots ,L-1\).每一步你可以移动到任意一个曼哈顿距离到自己小于等于\(d\)的任意一个合法坐标. ...

  9. 图神经网络(GNN)模型的基本原理

    一.概述   在人工智能领域,数据的多样性促使研究人员不断探索新的模型与算法.传统的神经网络在处理像图像.文本这类具有固定结构的数据时表现出色,但面对具有不规则拓扑结构的图数据,如社交网络.化学分子结 ...

  10. 在Linux下使用wxWidgets进行跨平台GUI开发(二)

    wxWidgets常见辅助类的应用示例 wxWidgets提供了一系列功能强大的辅助类(Helper Classes),涵盖了字符串处理.文件操作.XML解析.数据流.数据库和网络通信等功能,这些类为 ...