[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的 ...
随机推荐
- Linux实战教学笔记24:SSH连接原理及ssh-key
目录 第二十四节 SSH连接原理及ssh-key讲解 第1章 SSH服务 1.1 ssh介绍 1.2 知识小结 第2章 ssh结构 2.1 SSH加密技术 第3章 ssh服务认证类型 3.1 基于口令 ...
- AssetBundle依赖
[Managing asset dependencies] 一个Asset会依赖其它Asset.可以把一个Asset所依赖的Asset也打包进自己的AssetBundle.可是多个Asset可能依赖同 ...
- 10 华电内部文档搜索系统 search03
上一节讲解了怎么在Struts 2下面使用内置对象传值,在Struts 2下面是用Session或者Request存放对象.在Struts 2下面是用内部对象传值,和JSP页面下面稍微有些不同.但是实 ...
- App审核被拒(后台定位被拒,ipv6被拒,广告标示被拒的解决方案)
ipv6被拒问题描述: 解决方案支持ipv6 1)搭建ipv6 环境,搭建好的ipv6 ,环境会有一个共享wifi, 具体如何搭建ipv6测试环境参考本地如何搭建IPv6环境测试你的APP2)app连 ...
- 为什么要用Android Studio?
为什么要用Android Studio 本书节选自<Android Studio实用指南> 作者: 毕小朋 目前本书已上传到百度阅读,在百度中搜索[Anroid Studio实用指南]便可 ...
- jquery入门 修改网页背景颜色
我们在浏览一些网站,尤其是一些小说网站的时候,都会有修改页面背景颜色的地方,这个功能使用jquery很容易实现. 效果图: show you code: <!doctype html> & ...
- tftp-hpa客户端使用说明
1.板子 sudo apt-get install tftp-hpa 2.主机chmod 777 tftp—dir 3.tftp -4 192.168.1.122 -c put lib2.tar.gz ...
- eclipse在线安装mybatis generator插件
转自:http://blog.csdn.net/u012283609/article/details/67640433 安装步骤: 打开eclipse菜单栏help–>Eclipse Marke ...
- Mysql(Navicat for Mysql)怎么添加数据库
1.首先打开Navicat for Mysql: 2.打开后界面如下图所示,双击连接localhost_3306: 3.连接后localhost_3306变成绿色,如下图所示: 4.选中下面任意数据库 ...
- [C++] NULL VS nullptr
NULL VS nullptr