zoukankan      html  css  js  c++  java
  • 「Neerc2016」Expect to Wait

    题目描述

    ls最近开了一家图书馆,大家听说是ls开的,纷纷过来借书,自然就会出现供不应求的情况, 并且借书的过程类 似一个队列,每次有人来借书就将它加至队尾,每次有人来还书就把书借给队头的若干个人,定义每个人的等待时 间为拿到书的时刻减去加至队列的时刻,如果一个人根本就拿不到书,则等待时间为inf,现在给出所有时刻借书 还书的情况,和若干个询问,每次询问当图书馆初始有x本书时所有人的等待时间之和是多少(如果存在一个人根 本拿不到书,则输出INFINITY 1<=n,q<=100000

    Sol

    [一费2/1 我!]

    我们先考虑开始书的数量为0的时候,显然我们可以O(N)计算出每个点需要等待的人数,而总的等待时间就是每个点等待的人数求一下和233

    考虑修改开始的书的数量到K的过程,其实就是把后面每个点的等待人数减去K,再把大于0的部分求一下和

    那么现在我们就有一个非常显然的思路,二分

    我们先根据每个点有多少个人在等待排一下序,排序完之后 我们每次就可以用一个log的效率去查找第一个被减去K不小于0的人的位置,然后求一个后缀和就可以了

    至于无解的判断就是在K=0的时候,最后一个时间的等待的人数大于开始给的人数,就无解啦233

    代码细节还是挺多的建议考虑清楚再写…[多写了个等号挂了1个小时….]

    Code

    1. #include <bits/stdc++.h>  
    2. using namespace std;  
    3. int N,Q,T[100005],K[100005],Now,NNow;  
    4. long long Suffix[100005],Suffix1[100005];  
    5. struct Node  
    6. {  
    7.     int c;  
    8.     int T;  
    9. }node[100005];  
    10. int temp(Node x,Node y){return x.c<y.c;}  
    11. char c[100005];  
    12. char qwq[10005];  
    13. int main()  
    14. {  
    15.     freopen("expect.in","r",stdin);  
    16.     freopen("expect.out","w",stdout);  
    17.     cin>>N>>Q;  
    18.         for (int i=1;i<=N;i++)  
    19.     scanf("%s%d%d",&qwq,&T[i],&K[i]),c[i]=qwq[0];  
    20.     for (int i=1;i<=N;i++)  
    21.     {  
    22.     if (c[i]=='+') Now+=K[i];  
    23.     if (c[i]=='-') Now-=K[i];  
    24.     if (Now<0)  
    25.       node[i].c=-Now;  
    26.     if (i!=N)   
    27.      node[i].T=T[i+1]-T[i];  
    28.     }  
    29.     int rr=node[N].c;      
    30.     sort(node+1,node+N+1,temp);  
    31.     for (int i=N;i>=0;i--)  
    32.     {  
    33.       Suffix[i]=Suffix[i+1]+node[i].T;  
    34.       Suffix1[i]=Suffix1[i+1]+1ll*node[i].T*node[i].c*1ll;  
    35.     }  
    36.     
    37.     for (int i=1;i<=Q;i++)  
    38.     {  
    39.        scanf("%d",&NNow);  
    40.        int l=0,r=N+1,anss=0;  
    41.        while (l<=r)  
    42.         {  
    43.         int mid=(l+r)>>1;  
    44.         if (node[mid].c<=NNow)  
    45.         l=mid+1;  
    46.         else r=mid-1,anss=mid;  
    47.         }  
    48.     if (NNow<rr)   
    49.     {  
    50.     printf("INFINITY ");  
    51.     continue;  
    52.     }  
    53.     if (anss==0)  
    54.     {  
    55.     printf("0 ");  
    56.     continue;  
    57.     }  
    58.       long long ans=(Suffix1[anss])-1ll*NNow*(Suffix[anss]);  
    59.     printf("%lld ",ans);  
    60.     }  
    61.     return 0;  
  • 相关阅读:
    try,catch,finally的简单问题
    设置类可序列化,写入VIewState
    jQuery实现购物车物品数量的加减 (针对GirdView的类似事件)
    js获取Gridview中的控件id
    asmx ASp.net AJAX使用 ScriptManager
    js返回上一页并刷新,JS实现关闭当前子窗口,刷新父窗口
    asp.net(c#)网页跳转七种方法小结
    在触发器中回滚和提交
    redis 缓存对象、列表
    spring cloud 停止服务
  • 原文地址:https://www.cnblogs.com/si--nian/p/10508666.html
Copyright © 2011-2022 走看看