[arc082f]Sandglass 递推
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 递推的更多相关文章
- 【BZOJ-2476】战场的数目 矩阵乘法 + 递推
2476: 战场的数目 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 58 Solved: 38[Submit][Status][Discuss] D ...
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- Flags-Ural1225简单递推
Time limit: 1.0 second Memory limit: 64 MB On the Day of the Flag of Russia a shop-owner decided to ...
- 利用Cayley-Hamilton theorem 优化矩阵线性递推
平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- 简单递推 HDU-2108
要成为一个ACMer,就是要不断学习,不断刷题...最近写了一些递推,发现递推规律还是挺明显的,最简单的斐波那契函数(爬楼梯问题),这个大家应该都会,看一点稍微进阶了一点的,不是简单的v[i] = v ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- openjudge1768 最大子矩阵[二维前缀和or递推|DP]
总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...
随机推荐
- 【HDU 6191】Query on A Tree 【可持久化字典树】
题目 给出一棵有n个结点的树,树根是1,每个结点给出一个value.然后给出q个询问,每个询问给出两个整数u和x,你要在以u结点为根的子树中找出一个结点v,使得val[v] xor x最大, 并输出这 ...
- 游戏动作师使用Unity3D遇到过的所有问题
http://blog.csdn.net/onafioo/article/details/50865169 http://www.gameres.com/thread_480489.html 文/拉撒 ...
- 377. Combination Sum IV 返回符合目标和的组数
[抄题]: Given an integer array with all positive numbers and no duplicates, find the number of possibl ...
- Linux ftp Command
一.ftp的get命令和mget命令有何不同? get一次只下载一个文件:mget一次可以下载多个文件,而且支持通配符,需要注意的是在mget的时侯,需要对每一个文件都选择y/n,如果想不交互的下载全 ...
- ConcurrentHashMap的实现原理与使用
一.适应ConcurrentHashMap的原因 HashMap存在线程不安全的问题,HashTable效率十分低下,因此,ConcurrentHashMap有了合适的登场机会. (1)HashTab ...
- tp5 select回显
<select name="role_id" id="" class="form-control" required> {vol ...
- itunes win10应用商店安装 升级固件路径
win + r 在运行中输入: %localappdata%\Packages\AppleInc.iTunes_nzyj5cx40ttqa\LocalCache\Roaming\Apple Compu ...
- matrix derivatives
来源:cs229 stanford Machine Learning Notes
- java操作ceph之rbd基本操作
一.安装librados和librbd Ceph存储集群提供了基本的存储服务,允许Ceph在一个统一的系统中唯一地传送对象,块和文件存储. 但是,不限于使用RESTful,块或POSIX接口. 基于R ...
- Dubbo服务启动依赖检查
dubbo 官方文档地址:http://dubbo.io/User+Guide-zh.htm 项目中存在服务之间存在循环依赖,启动时总是报错,通过修改启动检查check=false解决,下面是dubb ...