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.

样例输入

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
",ans[i]);
    return 0;
}
View Code


原文地址:https://www.cnblogs.com/tetew/p/9419621.html