博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AtCoder Regular Contest 082 F
阅读量:5935 次
发布时间:2019-06-19

本文共 3224 字,大约阅读时间需要 10 分钟。

Problem Statement

We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contain some amount of sand. When we put the sandglass, either bulb A or B lies on top of the other and becomes the upper bulb. The other bulb becomes the lower bulb.

The sand drops from the upper bulb to the lower bulb at a rate of 1 gram per second. When the upper bulb no longer contains any sand, nothing happens.

Initially at time 0, bulb A is the upper bulb and contains a grams of sand; bulb B contains Xa grams of sand (for a total of X grams).

We will turn over the sandglass at time r1,r2,..,rK. Assume that this is an instantaneous action and takes no time. Here, time t refer to the time t seconds after time 0.

You are given Q queries. Each query is in the form of (ti,ai). For each query, assume that a=ai and find the amount of sand that would be contained in bulb A at time ti.

Constraints

  • 1≤X≤109
  • 1≤K≤105
  • 1≤r1<r2<..<rK≤109
  • 1≤Q≤105
  • 0≤t1<t2<..<tQ≤109
  • 0≤aiX(1≤iQ)
  • All input values are integers.

Input

The input is given from Standard Input in the following format:

XKr1 r2 .. rKQt1 a1t2 a2:tQ aQ

Output

For each query, print the answer in its own line.


Sample Input 1

Copy
180360 120 180330 9061 1180 180

Sample Output 1

Copy
601120

In the first query, 30 out of the initial 90 grams of sand will drop from bulb A, resulting in 60 grams. In the second query, the initial 1 gram of sand will drop from bulb A, and nothing will happen for the next 59 seconds. Then, we will turn over the sandglass, and 1 second after this, bulb A contains 1 gram of sand at the time in question.


Sample Input 2

Copy
100110000040 10090 100100 100101 100

Sample Output 2

Copy
1001000

In every query, the upper bulb initially contains 100 grams, and the question in time comes before we turn over the sandglass.


Sample Input 3

Copy
100548 141 231 314 42570 1950 98143 30231 55342 0365 100600 10

Sample Output 3

Copy
195291105842100 ——————————————————————————————— 题目大意就是就是有一个排序好的数列,每次全部数+或-一个数,然后把<0的变成0,>X的变成X 这样我们可以算出每个询问在最后一次翻转后的状态 维护一个mn(初值为0)和一个mx(初值为沙子总数) 这样每次修改的时候我们算一下mn和mx的变换之后就可以得到所有的值在最后都是在mn'和mx之间 得到最后一次旋转后的值之后就可以直接算了 其实就是类似线段树的限制值的范围的那种操作以及区间+ - 只是这里不需要而已
#include
#include
#include
#define LL long longusing namespace std;const int M=1e5+7;int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f;}int ans[M],T[M];struct pos{
int T,s;}e[M];int x,k=1,n,m,sgn=-1;void calc(LL &k){
if(k<0) k=0; if(k>x) k=x;}int main(){ x=read(); n=read(); for(int i=1;i<=n;i++) T[i]=read(); m=read(); for(int i=1;i<=m;i++) e[i].T=read(),e[i].s=read(); LL h=0,mx=x,mn=0; for(int i=1;i<=m;i++){ while(k<=n&&T[k]<=e[i].T){ LL v=(T[k]-T[k-1])*sgn; mx+=v; mn+=v; h+=v; calc(mx); calc(mn); k++;sgn*=-1; } LL now=e[i].s+h,nowh=(e[i].T-T[k-1])*sgn; if(now
mx) now=mx; now+=nowh; calc(now); printf("%lld\n",now); } return 0;}
View Code

 

 

转载于:https://www.cnblogs.com/lyzuikeai/p/7469859.html

你可能感兴趣的文章
What does corn harvester involve?
查看>>
阿里云服务器ECS开放8080端口
查看>>
Centos7静默安装Oracle11g并设置开机自启
查看>>
某程序员上线原谅宝:不做接盘侠
查看>>
「BATJ面试系列」并发编程之synchronized实现原理
查看>>
前端常用排序详解
查看>>
Spring中实现监听的方法
查看>>
使用Tooltip会出现一个问题,如果行上出现复选框
查看>>
11.03T1 DP
查看>>
Java 代码安全(一) —— 避免用String储存敏感数据
查看>>
第二周 IP通信基础回顾
查看>>
gradle-4.1-all.zip
查看>>
P2924 [USACO08DEC]大栅栏Largest Fence
查看>>
jQuery操作table tr td
查看>>
工作总结:MFC自写排序算法(升序)
查看>>
螺旋队列问题之二
查看>>
扩展运算符和解构赋值的理解
查看>>
焦点不在input或textarea中,屏蔽回格按钮
查看>>
后缀数组(suffix array)详解
查看>>
爬虫 lxml 模块
查看>>