zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    正则表达式中的贪婪模式与非贪婪模式详解
    关于Python中正则表达式的反斜杠问题
    每日思考记录(1)
    软件设计——2018年上半年选择题重要知识点
    统一过程UP
    软件设计复习7
    软件设计复习6
    软件设计复习5
    软件设计复习4
    软件设计复习3
  • 原文地址:https://www.cnblogs.com/tetew/p/9419621.html
Copyright © 2011-2022 走看看