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\),下方的玻璃球为 ...
随机推荐
- 2. node接口搭建--连接MongoDB数据库 (参考https://blog.csdn.net/ncepu_Chen/article/details/98725104#_337)
1.使用mongoose连接MongoDB数据库 npm install mongoose 2.新建文件夹config存放数据库地址 3.安装MongoDB
- [opencv]拟合vector<Mat>集合区域接近的元素
vector<Rect> PublicCardFrameDetection::fitrect(vector<Rect> rects){ int size = rects.siz ...
- CS5212Capstone|DP转VGA方案设计芯片|CS5212设计资料
CS5212是台湾CAPSTONE最新开发出一款用于DP转VGA方案设计芯片,其周围器件较少,设计简单,整体BOM成本低,市场性价比较高. CS5212内置MCU是工业标准8051核心单片机处理器.C ...
- 编写Java程序,现要求使用 dom4j 解析 city.xml 文档,实现省份及对应城市的联动特效,效果如图所示
查看本章节 查看作业目录 需求说明: 现要求使用 dom4j 解析 city.xml 文档,实现省份及对应城市的联动特效,效果如图所示 实现思路: 创建解析 XML 文档类 ParseXML 和窗体类 ...
- Java面向对象笔记 • 【第2章 面向对象进阶】
全部章节 >>>> 本章目录 2.1 成员变量 2.1.1 成员变量与局部变量的区别 2.1.2 成员变量的使用 2.1.3 实践练习 2.2 this关键字 2.2.1 ...
- Fences桌面图标分类
1.简介 Fences也称为栅栏桌面, 可以用来分类和组织桌面上的图标. Fences可以将不同的图标放到不同的容器当中, 还可以自由的设置这个容器,比如移动和拉伸等等. 这样图标分类后,桌面就整洁多 ...
- 论文翻译:2020_A Robust and Cascaded Acoustic Echo Cancellation Based on Deep Learning
论文地址:https://indico2.conference4me.psnc.pl/event/35/contributions/3364/attachments/777/815/Thu-1-10- ...
- Swoole 中使用 WebSocket 异步服务器、WebSocket 协程服务器
WebSocket 异步风格服务器 WebSocket\Server 继承自 Http\Server,所以 Http\Server 提供的所有 API 和配置项都可以使用. # ws_server.p ...
- svn创建多个版本库
mkdir /pangbing cd /pangbing/ svnadmin create 1 svnadmin create 2 svnadmin create3 启动时候这样启动 svnserve ...
- Python基础之pytest参数化
上篇博文介绍过,pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升.在实际 工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余.这里,我们来了解一下 @pytest.ma ...