Sandglass
题目描述
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 X−a 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≤ai≤X(1≤i≤Q)
All input values are integers.
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 X−a 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≤ai≤X(1≤i≤Q)
All input values are integers.
样例输入
180
3
60 120 180
3
30 90
61 1
180 180
样例输出
60
1
120
题解移步晨哥博客https://www.cnblogs.com/tian-luo/p/9387640.html
然后其实题目数据是按照时间顺序给的,所以我代码中的排序其实是没有用的qwq
#include<bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f using namespace std; const int N=1e5+50; ll x; int n,m; struct orz{ ll t,a; int id;}c[N]; ll r[N],ans[N]; bool cmp(orz a,orz b) { return a.t<b.t; } int main() { scanf("%lld",&x); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lld",&r[i]); scanf("%d",&m); for (int i=1;i<=m;i++) { scanf("%lld%lld",&c[i].t,&c[i].a); c[i].id=i; } sort(c+1,c+1+m,cmp); r[n+1]=c[m].t+1; ll mx=x,mn=0,tmp=0,tt=0,flag=-1; int k=1; for (int i=1;i<=m;i++) { while (r[k]<=c[i].t&&k<=n) { tt=(r[k]-r[k-1])*flag; tmp+=tt; mx+=tt; mn+=tt; if (mn>x) mn=x; if (mn<0) mn=0; if (mx>x) mx=x; if (mx<0) mx=0; k++; flag*=-1; } ll now=c[i].a+tmp; //cout<<'*'<<now<<' '<<tmp<<' '; if (now>mx) now=mx; else if (now<mn) now=mn; //cout<<now<<endl; if (k%2) ans[c[i].id]=max(now-(c[i].t-r[k-1]),(ll)0); else ans[c[i].id]=min(now+(c[i].t-r[k-1]),x); } for (int i=1;i<=m;i++) printf("%lld\n",ans[i]); return 0; }