Description

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

在第0个时刻,A中有aa克沙子,B中有X−aX−a克沙子(总共有XX克沙子),且U为A,L为B(即A上B下)。

在r1,r2,...,rKr1,r2,...,rK这些时刻,我们将倒转整个沙漏,使得原来的U变成L,原来的L变成U。对于翻转操作,t时刻是指从第0个时刻起经过t秒后的时刻,我们可以将翻转沙漏的操作看做瞬间完成的。

现在有Q次询问,每一次询问会给定一对非负整数(ti,ai)(ti,ai),求a=aia=ai,第titi时刻,A中所含沙子的克数。

Input

第一行一个正整数XX

第二行一个正整数KK

第三行K个整数,表示r1,r2,...,rKr1,r2,...,rK

接下来一行一个正整数QQ

接下来QQ行,每行两个非负整数,分别表示每次次询问的(ti,ai)(ti,ai)

Output

一共QQ行

对于每次询问,输出一行一个非负整数表示答案。

Sample Input

Sample 1
180
3
60 120 180
3
30 90
61 1
180 180 Sample 2
100
1
100000
4
0 100
90 100
100 100
101 100 Sample 3
100
5
48 141 231 314 425
7
0 19
50 98
143 30
231 55
342 0
365 100
600 10

Sample Output

Sample 1
60
1
120 Sample 2
100
10
0
0 Sample 3
19
52
91
10
58
42
100

HINT

1≤X≤1091≤X≤109

1≤K≤1051≤K≤105

1≤r1<r2<...<rK≤1091≤r1<r2<...<rK≤109

1≤Q≤1051≤Q≤105

0≤t1<t2<...<tQ≤1090≤t1<t2<...<tQ≤109

0≤ai≤X(1≤i≤Q)0≤ai≤X(1≤i≤Q)

所有输入数据均为非负整数

Sol

我们发现对于一些连续的起始函数值,到了一定时间会相交。

我们维护up[i]表示大于等于up[i]的相交,dn[i]表示小于等于dn[i]的相交,dt[i]表示中间区间从开始到现在的相对变化值,然后中间不相交的可以通过线性平移得到。所以对于某个询问,我们找到这个询问前的一个翻转点,判断初始值和updn的关系,确定一个等价的初始值之后加上变化值,加上翻转点到当前时刻的贡献,即为答案。

dn和up由于单调性,所以可以递推求解。。。注意dn不能大于up。。

Code

#include <bits/stdc++.h>
using namespace std;
int x,k,q,t,a,mx[100005],mn[100005],dt[100005],rv[100005],ans;
int main()
{
scanf("%d%d",&x,&k);mx[0]=x;mn[0]=0;dt[0]=0;
for(int i=1;i<=k;i++) scanf("%d",&rv[i]);
for(int i=1;i<=k;i++)
{
mx[i]=mx[i-1];mn[i]=mn[i-1];int tmp=rv[i]-rv[i-1];
if(i&1) mn[i]=max(mn[i],min(mx[i],tmp-dt[i-1])),dt[i]=max(mn[i-1]+dt[i-1]-tmp,0)-mn[i];
else mx[i]=min(mx[i],max(mn[i],x-tmp-dt[i-1])),dt[i]=min(mx[i-1]+dt[i-1]+tmp,x)-mx[i];
}
for(scanf("%d",&q);q--;printf("%d\n",ans))
{
scanf("%d%d",&t,&a);int pos=upper_bound(rv+1,rv+k+1,t)-rv-1;
if(a<=mn[pos]) a=mn[pos];else if(a>=mx[pos]) a=mx[pos];
ans=a+dt[pos];int tmp=t-rv[pos];
if(pos&1) ans=min(x,ans+tmp);else ans=max(0,ans-tmp);
}
}

[arc082f]Sandglass 递推的更多相关文章

  1. 【BZOJ-2476】战场的数目 矩阵乘法 + 递推

    2476: 战场的数目 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 58  Solved: 38[Submit][Status][Discuss] D ...

  2. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  3. Flags-Ural1225简单递推

    Time limit: 1.0 second Memory limit: 64 MB On the Day of the Flag of Russia a shop-owner decided to ...

  4. 利用Cayley-Hamilton theorem 优化矩阵线性递推

    平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...

  5. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  6. 简单递推 HDU-2108

    要成为一个ACMer,就是要不断学习,不断刷题...最近写了一些递推,发现递推规律还是挺明显的,最简单的斐波那契函数(爬楼梯问题),这个大家应该都会,看一点稍微进阶了一点的,不是简单的v[i] = v ...

  7. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  8. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  9. openjudge1768 最大子矩阵[二维前缀和or递推|DP]

    总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...

随机推荐

  1. Redhat Cluster Suite原理介绍

      RedHat Cluster Suite简称RHCS,是一个能够提供高可用性.高可靠性.负载均衡.存储共享且经济廉价的集群工具集合,基于RHCS可以搭建高可用性集群.负载均衡集群.存储集群和高性能 ...

  2. vagrant 安装与配置

    1.下载vagrant的安装包 http://downloads.vagrantup.com/ 2.解压安装 3.安装box环境   4.安装成功显示 5.提示要安装virbox

  3. spring4-2-bean配置-10-通过FactoryBean配置bean

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAk8AAAFHCAIAAAA3Hj/JAAAgAElEQVR4nO2dzdX0rA2Gp6asclwQTW

  4. 解决T4模板的程序集引用的五种方案

    在众多.NET应用下的代码生成方案中,比如CodeDOM,BuildProvider, 我觉得T4是最好的一种.关于T4的基本概念和模板结果,可以参考我的文章<基于T4的代码生成方式>.如 ...

  5. WebAPI如何返回json

    public HttpResponseMessage PostUser(User user) { JavaScriptSerializer serializer = new JavaScriptSer ...

  6. 常用工具类——StringUtils

    /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreem ...

  7. Go 语言并发笔记

    前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...

  8. [GO]使用select实现超时

    package main import ( "fmt" "time" ) func main() { ch := make(chan int) quit := ...

  9. java Jvm工作原理学习笔记

    一.         JVM的生命周期 1.       JVM实例对应了一个独立运行的java程序它是进程级别 a)     启动.启动一个Java程序时,一个JVM实例就产生了,任何一个拥有pub ...

  10. CodeForces 540C Ice Cave (BFS)

    题意:给定 n * m的矩阵,让你并给定初始坐标和末坐标,你只能走'.',并且走过的'.'都会变成'X',然后问你能不能在末坐标是'X'的时候走进去. 析:这个题,在比赛时就是没做出来,其实是一个水题 ...