Description

传送门

Solution

这题是真的666啊。。。

以下是本题最关键最关键的结论:如果ai<=aj,则在某个时间t,前者的A中沙子克数(记为t(ai))一定大于等于t(aj)。证明显然。

假设我们目前处理到到询问为(t,a),设ri为满足ri<=t的最大值。我们要处理三个量:

1,时刻ri,在不考虑限制(即不考虑沙子数只能为[0,X]范围,它可能比X大,也可能比0小)的情况下,相对于初始时的沙子数变化c。

2,时刻ri,初始A中沙子为0情况下的沙子数down。

3,时刻ri,初始沙子为X情况下的沙子数up。

经过分析,沙子数a加减的过程有4中情况(以下情况的沙子数都是指A中的)。

1:a没有被“沙子数只能为[0,X]范围”这个条件限制过。

2:a只被“沙子数必须<=X”条件限制过。

3:a只被“沙子数必须>=0”条件限制过。

4:a被“沙子数必须>=0”和“沙子数必须<=X”两个条件都限制过。

此处的"限制过"是指在计算到某一步的时候,沙子数量达到极限以至于不会再从上往下掉落。从数学的角度看(以条件沙子数必须>=0为例),即为:a-(r[k]-r[k-1])<0,但由于题目要求,a必须=0。

在最终判断答案的时候,询问(t,a)在时刻ri沙子数的式子为max(down,min(up,a+c))。

证明:

情况1中,由于本题结论并且0<=a<=X,可得a+c<=up,a+c>=down,式子答案为a+c,又因为a没有被限制过,所以该答案正确。

情况2中,假设在时刻t0,a被限制,即t0(a)=X,又因为本题结论,t0(a)<=t0(X),则t0(X)=X。在这一时刻t0(a)=t0(X),正确答案即为up。由于a+c是不受限制(沙子数>=X)的结果,所以a+c>=up。即min(up,a+c)=up,up>=down,式子答案为up,正确。

情况3同理;

情况4由于t(a)=up=down,不论a+c与t(up)的大小关系如何都正确。

求出(ri,a)后,记录一下接下来应该加还是减,直接操作便可得出(t,a)。

所以我们只需要把询问按时间排个序扫一遍就过啦。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int X,k,r[],Q;
struct node{int t,a,id;
}q[];int ans[];
bool cmp(node x,node y) {return x.t<y.t;}
int pls(int x,int y){return max(,min(X,x+y));}
int main()
{
scanf("%d%d",&X,&k);
for (int i=;i<=k;i++) scanf("%d",&r[i]);
scanf("%d",&Q);
for (int i=;i<=Q;i++)
{
scanf("%d%d",&q[i].t,&q[i].a);q[i].id=i;
}
sort(q+,q+Q+,cmp);
int topr=,topq=,sum=,down=,up=X,add=,js=-;
int cnt;
while (topq<=Q)
{
if (r[topr+]<q[topq].t&&topr<k)
{
topr++;
add=js*(r[topr]-r[topr-]);
down=pls(down,add);up=pls(up,add);
sum+=add;js=-js;
} else
{
cnt=q[topq].t-r[topr];
ans[q[topq].id]=pls(max(down,min(up,q[topq].a+sum)),js*cnt);
topq++;
}
}
for (int i=;i<=Q;i++) printf("%d\n",ans[i]); }

[arc082F]Sandglass的更多相关文章

  1. [arc082f]Sandglass 递推

    Description 有一个沙漏由两个上下相通玻璃球A和B构成,这两个玻璃球都含有一定量的沙子,我们暂且假定AB中位于上方的玻璃球的为U,下方的玻璃球为L,则除非U中没有沙子,否则每秒钟都会有1克沙 ...

  2. [ARC082F] Sandglass(线段树)

    Description 有一个沙漏由两个上下相通玻璃球 \(A\) 和 \(B\) 构成,这两个玻璃球都含有一定量的沙子,我们暂且假定 \(AB\) 中位于上方的玻璃球的为 \(U\),下方的玻璃球为 ...

  3. ARC-082F Sandglass

    题意 有一个含有两个玻璃球的沙漏,分别称这两个玻璃球为\(

  4. NOIp模拟赛二十八

    (这是NOIp模拟赛?应该是NOI模拟赛不小心加了个p) 嗯,假装这是正经的NOIp模拟赛,从今天开始也写写题解吧(这几天被虐的惨惨) 今日情况:8+50+0=58 A题输出样例,B题正解写挂,C题不 ...

  5. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  6. Sandglass

    题目描述 We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contain some amount ...

  7. 【AtCoder】ARC082 F - Sandglass

    [链接]F - Sandglass [题意]给定沙漏A和B,分别装着a和X-a的沙子,开始时A在上B在下,每秒漏1,漏完不再漏.给定n,有n个时刻ai沙漏倒转.给定m个询问,每次询问给定初值a和时刻t ...

  8. 2017国家集训队作业[arc082d]Sandglass

    2017国家集训队作业[arc082d]Sandglass 题意: ​ 有一个沙漏,初始时\(A\)瓶在上方,两个瓶子的最大容量都为\(X\)克,沙子流动的速度为\(1g\)每单位时间.给出\(K\) ...

  9. 【ARC082D】Sandglass

    Description ​ 题目链接 Description ​ 好题.题意是维护一个初始值,交替加减一段时间,有上界\(m\)和下界0(不能超过这两条界限),问对于某一种初始值,在某一个时刻时该值为 ...

随机推荐

  1. centos7安装docker-ce新版

    先卸载系统的旧版本yum remove docker \              docker-common \              docker-selinux \              ...

  2. python异常处理及内置模块

    异常处理 有时候我们在写程序的时候会出现错误或者异常,导致程序终止,如下这个例子: #!/usr/bin/env python a = 2/0 print(a) 结果提示如下错误: Traceback ...

  3. BZOJ 1270 雷涛的小猫 dp

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1270 题目大意: 雷涛的小猫雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助 ...

  4. CF 553E Kyoya and Train

    题目分析 期望\(\text{dp}\). 设\(f_{i,j}\)表示在第\(j\)个时刻从\(i\)点出发,到达终点的期望花费. 有转移方程: \[ f_{x,t}=\min_{(x,y)\in ...

  5. Xpath提取一个标签里的所有文本

    content = etree.HTML(text) h = content.xpath('//h1') h1 = h[0].xpath('string(.)').strip()

  6. BZOJ1972:[SDOI2010]猪国杀(模拟)

    Description 太长就不贴过来了 Solution 这个题是真的不难写……唯一的难度就在于理解题意上面……感觉这就是个阅读理解题啊…… 而且你三国杀玩的越多可能就越难写因为你无法理解那些猪的思 ...

  7. 【LGP5161】WD与数列

    题目 也是可以用\(SAM\)来做的 我们发现要求原串不相交,那么就要求在差分序列里不相交并且不相邻 考虑一下\(SAM\),暴力做法自然是对每一个节点统计其所有\(endpos\)的影响 既然这样我 ...

  8. [luogu1979] 华容道

    题面 ​ 先讲点无关的,这道题是真的恶心... ​ 好了,第一眼看到这道题,肯定是准备暴搜的,但是想了一想,省选难度的题目不可能一上来就让你暴搜吧,于是开启了无穷无尽的分析,我们不妨设指定棋子叫做移动 ...

  9. Mysql数据库写入数据速度优化

    Mysql数据库写入数据速度优化 1)innodb_flush_log_at_trx_commit 默认值为1:设置为0,可以提高写入速度.  值为0:提升写入速度,但是安全方面较差,mysql服务器 ...

  10. 使用mongodb提供的dotnet core sdk进行地理位置运算

    mongodb提供地理位置运算功能,比较常用的场景比如,先判断用户所在的街道,然后看看街道附近有啥餐厅,然后算算用户与餐厅的距离什么的,官网里提供了比较详细的demo介绍不同api的用法 此处记录下d ...