AT3527 [ARC082D] Sandglass
解法一
直接考虑在初始为 \(a\) 的情况下时刻 \(t\) 时 \(A\) 中剩余的沙子是行不通的,不妨反过来考虑在时刻 \(t\) 每个初始值 \(a\) 的答案,令其为 \(f_t(a)\)。
因为若一开始 \(A\) 中沙子多之后的任意时刻 \(A\) 中的沙子也会更多,那么我们可以发现:\(f_t(0) \le f_t(1) \le \cdots \le f_t(X)\)。
单独考虑我们现在要求的 \(f_t(a)\),若 \(f_t(a)\) 的函数图像在某一点和 \(f_t(0) / f_t(X)\) 相交那么其接下来的函数图像必然会与 \(f_t(0) / f_t(X)\) 重合。
如果没有相交的话,\(f_t(a)\) 也必然不会与 \(y = X, y = 0\) 相交,此时就不会出现与 \(0\) 取 \(\max\) 或与 \(X\) 取 \(\min\) 的情况了,此时的函数值就可以快速算出了。
于是难点在于如何判断 \(f_t(a)\) 是否与 \(f_t(0), f_t(X)\) 相交。
首先我们先算出如果不相交的函数值 \(g_t(a)\),直觉告诉我们若 \(f_t(0) < g_t(a) < f_t(X)\) 那么没有相交否则越过哪条线就会与哪条线相交。
因为相交处必然在 \(y = 0, y = X\) 上,那么一旦相交就会比 \(f_t(0), f_t(X)\) 慢半拍以至于后面肯定在区间外。
那么我们只需计算出每个查询时刻 \(f_t(0), f_t(X)\) 以及不算相交的值即可,复杂度 \(\mathcal{O(n + m)}\)。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; ++i)
const int N = 1e5 + 5;
int n, q, t, a, k, X, P, buf, f[2], r[N];
int F(int x, int buf) { return max(0ll, min(X, x + buf));}
signed main () {
cin >> X >> n;
rep(i, 1, n) cin >> r[i];
cin >> q, P = 1;
f[0] = 0, f[1] = X;
while (q--) {
cin >> t >> a;
for (; r[P] <= t && P <= n; ++P) {
buf = (P & 1) ? -(r[P] - r[P - 1]) : (r[P] - r[P - 1]);
k += buf;
f[0] = F(f[0], buf), f[1] = F(f[1], buf);
}
buf = (P & 1) ? r[P - 1] - t : t - r[P - 1];
printf("%lld\n", max(F(f[0], buf), min(F(f[1], buf), a + k + buf)));
}
return 0;
}
解法二
首先需要解法一中相交及之前的分析。
接下来你会发现,函数图像一定先是一段与 \(f_t(0)\) 相同,然后是一段斜率为 \(1\) 的线段,接着一段与 \(f_t(X)\) 相同。
并且这一段与 \(f_t(0) / f_t(X)\) 相同的点对于接下来的每个时刻依然会相同,于是我们只需考虑维护出不同的两个拐点以及 \(f_t(0), f_t(X)\) 的函数值即可。
第一步正难则反的思考是十分重要的。
其次,每当我们有了一个新的想法或转化以后一定要将这个想法或转化下的性质挖掘清楚,观察显得尤为重要。
AT3527 [ARC082D] Sandglass的更多相关文章
- 2017国家集训队作业[arc082d]Sandglass
2017国家集训队作业[arc082d]Sandglass 题意: 有一个沙漏,初始时\(A\)瓶在上方,两个瓶子的最大容量都为\(X\)克,沙子流动的速度为\(1g\)每单位时间.给出\(K\) ...
- 【ARC082D】Sandglass
Description 题目链接 Description 好题.题意是维护一个初始值,交替加减一段时间,有上界\(m\)和下界0(不能超过这两条界限),问对于某一种初始值,在某一个时刻时该值为 ...
- Sandglass
题目描述 We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contain some amount ...
- 【AtCoder】ARC082 F - Sandglass
[链接]F - Sandglass [题意]给定沙漏A和B,分别装着a和X-a的沙子,开始时A在上B在下,每秒漏1,漏完不再漏.给定n,有n个时刻ai沙漏倒转.给定m个询问,每次询问给定初值a和时刻t ...
- [arc082F]Sandglass
Description 传送门 Solution 这题是真的666啊... 以下是本题最关键最关键的结论:如果ai<=aj,则在某个时间t,前者的A中沙子克数(记为t(ai))一定大于等于t(a ...
- [arc082f]Sandglass 递推
Description 有一个沙漏由两个上下相通玻璃球A和B构成,这两个玻璃球都含有一定量的沙子,我们暂且假定AB中位于上方的玻璃球的为U,下方的玻璃球为L,则除非U中没有沙子,否则每秒钟都会有1克沙 ...
- 【推导】【模拟】AtCoder Regular Contest 082 F - Sandglass
题意:有个沙漏,一开始bulb A在上,bulb B在下,A内有a数量的沙子,每一秒会向下掉落1.然后在K个时间点ri,会将沙漏倒置.然后又有m个询问,每次给a一个赋值ai,然后询问你在ti时刻,bu ...
- Arc082_F Sandglass
Description有一个沙漏由两个上下相通玻璃球$A$和$B$构成,这两个玻璃球都含有一定量的沙子,我们暂且假定$A,B$中位于上方的玻璃球的为$U$,下方的玻璃球为$L$,则除非$U$中没有沙子 ...
- [ARC082F] Sandglass(线段树)
Description 有一个沙漏由两个上下相通玻璃球 \(A\) 和 \(B\) 构成,这两个玻璃球都含有一定量的沙子,我们暂且假定 \(AB\) 中位于上方的玻璃球的为 \(U\),下方的玻璃球为 ...
随机推荐
- 【Java笔记】Java分包问题
这个图讲的很清晰,转自-http://www.bubuko.com/infodetail-2219664.html
- Order Statistic
目录 The Order Statistic 引理1 的一些基本性质 顺序统计量的分布 顺序统计量的条件分布 特殊分布的特殊性质 Order Statistic The Order Statistic ...
- JQuery的安装与下载教程
网页中添加 jQuery 可以通过多种方法在网页中添加 jQuery. 您可以使用以下方法: 从 jquery.com 下载 jQuery 库 从 CDN 中载入 jQuery, 如从 Google ...
- Windows环境下使用Linux命令
1.说明 如何在Windows环境下使用Linux命令, 这是一个屡见不鲜的问题, 而且已经有很多解决方法, 下面仅推荐几个我觉得好用的工具, 这些工具可能就是我们常用的软件, 而且已经在Window ...
- 使用docker或者docker-compose部署Zookeeper集群
之前有介绍过Zookeeper的安装部署(Zookeeper基础教程(二):Zookeeper安装),但是那里我是基于独立的虚拟机来实现部署的,这种部署方式适合线上集群部署.后来有几次想用一下Zook ...
- PowerShell【IF篇】
1 [int]$num=0 2 do 3 { 4 $num+=1 5 if($num%2) 6 { 7 "$num"+" 是奇数" 8 }else{ 9 &qu ...
- a href 鼠标滑过变成小手图标
<a id="l05" style="cursor:pointer;text-decoration:none;" href="<%=pat ...
- python 迭代器链式处理数据
pytorch.utils.data可兼容迭代数据训练处理,在dataloader中使用提高训练效率:借助迭代器避免内存溢出不足的现象.借助链式处理使得数据读取利用更高效(可类比操作系统的资源调控) ...
- HDU 2018 母牛的故事 (递归入门)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2018 思路分析: 问题分析:这道题的递推关系非常类似斐波那契数列,由题意不难得到以下函数递推式: 对于 ...
- TensorRT 开始
TensorRT 是 NVIDIA 自家的高性能推理库,其 Getting Started 列出了各资料入口,如下: 本文基于当前的 TensorRT 8.2 版本,将一步步介绍从安装,直到加速推理自 ...