首页 > 其他分享 >CF1826D Running Miles

CF1826D Running Miles

时间:2023-05-06 11:02:19浏览次数:28  
标签:std le int max lt long Running Miles CF1826D

题意

给你一个长度为 \(n\) 的序列 \(b\),求下面这个式子的值:

\[\max_{1 \le l \le i \lt j \lt k \le r \le n}(b_i + b_j + b_k -(r - l)) \]

\(n \le 10^5\)。

思路

官方题解给出的做法使用了单调栈,这里给出一种不用栈的做法。

首先,把题目的柿子优化下。显然,为了尽量地减小 \(r - l\) 的值,我们直接令 \(i = l\),\(k = r\)。于是有:

\[\begin{aligned} \mathrm{ans} &= \max_{1 \le l \le i \lt j \lt k \le r \le n}(b_i + b_j + b_k -(r - l)) \\ &= \max_{1 \le i \lt j \lt k \le n}(b_i + b_j + b_k - (k - i)) \\ &= \max_{1 \le i \lt j \lt k \le n}(b_j + (b_i + b_k) - (k - i)) \\ &= \max_{1 \le i \lt j \lt k \le n}(b_j + (b_i - (j - i)) + (b_k - (k - j))) \\ &= \max_{1 \lt j \lt n}(b_j + \max_{1 \le i \lt j}(b_i - (j - i)) + \max_{j \lt k \le n}(b_k - (k - j))) \end{aligned} \]

然后做法其实就比较显然了。对于每一个 \(j \in [2, n - 1]\),把 \(b_i - (j - i)\) 与 \(b_k - (k - j)\) 的最大值预处理出来,再扫一遍取最大值,就可以得到答案。

暴力预处理是 \(O(n^2)\) 的,但其实预处理可以通过 \(O(n)\) 递推实现,不妨设 \(f_j = \max_{1 \le i \lt j}(b_i - (j - i))\),不难看出 \(f\) 单调不减。假设已经得到了 \(f_{j - 1}\),由于 \(f\) 的单调性,\(f_j\) 有两种可能:

  1. \(f_j\) 对应的 \(i\) 与 \(f_{j - 1}\) 对应的 \(i\) 相同,再减掉一个坐标的增量,即 \(f_j = f_{j - 1} - 1\);
  2. \(f_j\) 对应的 \(i\) 为 \(j - 1\),则 \(f_j = b_{j - 1} - (j - (j - 1)) = b_{j - 1} - 1\)。

为什么只可能是这两种决策呢?因为 \(f\) 是具有单调性的,设 \(f_{j - 1}\) 对应的 \(i\) 值为 \(x\),如果存在 \(y \in [1, j - 1)\) 且 \(x \neq y\) 使得 \(y\) 为 \(f_j\) 对应的 \(i\) 的话,则有:

\[\begin{aligned} b_y - (j - y) &\ge b_x - (j - x) \\ b_y - ((j - 1) - y) &\ge b_x - ((j - 1) - x) \\ b_y - ((j - 1) - y) &\ge f_{j - 1} \\ \end{aligned} \]

而这与 \(x\) 为 \(f_{j - 1}\) 对应的 \(i\) 相矛盾,因为选择 \(y\) 比选择 \(x\) 更优。

\(\max_{j \lt k \le n}(b_k - (k - j))\) 的预处理同理,同样可以做到 \(O(n)\)。于是总的时间复杂度为 \(O(n)\)。

代码

#include <bits/stdc++.h>

using i64 = long long;
using i64u = unsigned long long;
using f80 = long double;

void solve() {
  int n;
  std::cin >> n;

  std::vector<int> b(n);
  for (int i = 0; i < n; i++) {
    std::cin >> b[i];
  }

  std::vector f(2, std::vector<int>(n));
  for (int i = 1; i < n; i++) {
    f[0][i] = std::max(f[0][i - 1], b[i - 1]) - 1;
  }
  for (int i = n - 2; i >= 0; i--) {
    f[1][i] = std::max(f[1][i + 1], b[i + 1]) - 1;
  }

  int ans = 0;
  for (int i = 1; i < n - 1; i++) {
    ans = std::max(ans, f[0][i] + f[1][i] + b[i]);
  }

  std::cout << ans << "\n";

  return;
}

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int t;
  std::cin >> t;

  while (t--) {
    solve();
  }

  return 0;
}

标签:std,le,int,max,lt,long,Running,Miles,CF1826D
From: https://www.cnblogs.com/forgot-dream/p/17376597.html

相关文章

  • D. Running Miles
    D.RunningMilesThereisastreetwith$n$sights,withsightnumber$i$being$i$milesfromthebeginningofthestreet.Sightnumber$i$hasbeauty$b_i$.Youwanttostartyourmorningjog$l$milesandendit$r$milesfromthebeginningofthestre......
  • Root privileges are required forrunning the Systemback!(转)
    在使用systemback对Linux服务器进行镜像备份时发现无法正常打开,报错显示:RootprivilegesarerequiredforrunningtheSystemback!或者UnsafeWindowauthorization!Pleasedonotuse‘sudo’command.后来发现有两种解决办法:1、获取权限suroot/usr/lib/systemback/sbsustart......
  • nacos报错:Nacos cluster is running with 1.X mode, can't accept gRPC request tempo
    nacos报错:Nacosclusterisrunningwith1.Xmode,can'tacceptgRPCrequesttemporarilynacos报错如下:Causedby:com.alibaba.nacos.api.exception.NacosException:Requestnacosserverfailed:atcom.alibaba.nacos.client.naming.remote.gprc.NamingGrp......
  • MySQL主从复制Slave_IO_Running为No
    主要记录解决问题的过程,为以后发现类似问题提供解决方法的参考。首先查看从机的mysql日志文件:tail/var/log/mysqld.log日志从上往下看,可以很快看到在中间位置上有一个ERROR的标志,后面写得很清楚,我的主机UUID和从机UUID重复了,而这两个UUID在这里要求必须要不相等的,所以我上面......
  • A stop job is running for LSB:start and stop redis_6379
     修改/etc/init.d/redis_6379(stop下红框中内容,格式:$CLIEXEC-a"password" -p$REDISPORTshutdown)  ......
  • 解决 Error running ‘Application‘: Command line is too long.
    一、项目场景:运行刚拉取下来的项目代码,出现下面问题描述的错误提示。二、问题描述Errorrunning'Application':Commandlineistoolong.ShortencommandlineforApplicationoralsoforSpringBootdefaultconfiguration?翻译翻译:运行“Application”时出错:命令行太长......
  • 《Ubuntu — NetworkManager开机提示A start job is running for Network Manager wai
    轉自:https://www.cnblogs.com/zhuangquan/p/13209758.html,僅供參考學習使用1.NetworkManagerUbuntuServer:Ubuntu的Server版本只有终端界面,没有桌面GUI,且Server版本不会安装NetworkManager,所以UbuntuServer网络由配置文件进行配置。由于Server版本一般用作服务器的......
  • 频繁设置CGroup触发linux内核bug导致CGroup running task不调度
    1.说明1>本篇是实际工作中linux上碰到的一个问题,一个使用了CGroup的进程处于R状态但不执行,也不退出,还不能kill,经过深入挖掘才发现是Cgroup的内核bug2>发现该bug后,去年给RedHat提交过漏洞,但可惜并未通过,不知道为什么,这里就发我博客公开了3>前面的2个帖子《极简cfs公平调度算......
  • Ubuntu开机卡“A start job is running for wait for network to be Configured”的解
    问题虚拟机安装ubuntu22.04TLS系统后,开机总会卡在等待网络连接好长时间。卡在AstartjobisrunningforhaitforNetworktobeConfigured(1min40s/no)这里如图所示解决办法进入系统后,打开终端,输入下面命令,cd/etc/systemd/system/network-online.target.wants/......
  • ambari-agent in not running
    ERROR2023-04-0609:24:25,787Controller.py:453-Controllerthreadfailedwithexception:Traceback(mostrecentcalllast): File"/usr/lib/python2.6/site-packages/ambari_agent/Controller.py",line438,inrun   self.actionQueue=ActionQueue(......