6604: Sandglass

题目链接

题目大意:给你一个沙漏(上下两部分),沙漏的总容量为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;
}

猜你喜欢

转载自blog.csdn.net/AC_AC_/article/details/81298337