题目大意:给你一个沙漏(上下两部分),沙漏的总容量为x,开始时A在上,B在下,给你k个时间段,在每个时间段翻转一次,再给你q个问题,每个问题包括一个t和a,a表示开始时A中沙子的容量,问你t时刻A中沙子有多少?
思路:让low=0,up=x,用low和up维护A中沙子的最少容量和最大容量(防止出边界),用add记录到r[i]时间段时,A中沙子的变化量,因为题目保证
0≤t1<t2<..<tQ≤109
0≤ai≤X(1≤i≤Q),所以走一次循环就可以。
用scanf和printf输入和输出,因为用cin和cout必须要关闭同步锁且不能使用endl,不然会TLE。
#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
int a,x,k,q,r[100010]={0},t,add,up,low,flag=0,pp;
int judge(int tt,int u=x,int l=0)//当传递给u和l值时,u和l为传递的值,否则默认为u=x,l=0
{
if(tt>u)
return u;
if(tt<l)
return l;
return tt;
}
int main()
{
scanf("%d%d",&x,&k);
for(int i=1;i<=k;i++)
scanf("%d",&r[i]);
scanf("%d",&q);
int now=1,up=x;
while(q--)
{
scanf("%d%d",&t,&a);
while(t>=r[now]&&now<=k)
{
pp=((flag?1:-1)*(r[now]-r[now-1]));
add+=pp;
up=judge(up+pp),low=judge(low+pp);
flag=!flag;
now++;
}
printf("%d\n",judge((flag?1:-1)*(t-r[now-1])+judge(a+add,up,low)));
}
return 0;
}