bzoj 4843: [Neerc2016]Expect to Wait

5 篇文章 0 订阅
1 篇文章 0 订阅

陈题。好题。补档。复习。
题意:ls最近开了一家图书馆,大家听说是ls开的,纷纷过来借书,自然就会出现供不应求的情况, 并且借书的过程类似一个队列,每次有人来借书就将它加至队尾,每次有人来还书就把书借给队头的若干个人,定义每个人的等待时间为拿到书的时刻减去加至队列的时刻,如果一个人根本就拿不到书,则等待时间为inf,现在给出所有时刻借书还书的情况,和若干个询问,每次询问当图书馆初始有x本书时所有人的等待时间之和是多少(如果存在一个人根本拿不到书,则输出INFINITY)。
题解:建立坐标系,y轴表示等着的人数,x轴表示时刻。等着的人数如果是负数的话就代表图书馆里的书。等待的时间就是面积。每个询问就相当于求一条直线上的面积。暴力扫描线搞搞就好了。
当时做的时候还不是权限题。。现在是了。。
代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,q,num=0;
long long ans[100010];
struct hh
{
    int x,y,type;
}a[200010];

void ins(int x,int y,int type)
{
    a[num++]={x,y,type};
}
int cmp(hh x,hh y)
{
    return x.x<y.x;
}
int main()
{
    scanf("%d%d",&n,&q);
    int c=0,last=0;
    for(int i=0;i<n;i++)
    {
        char s[5];
        int t,k;
        scanf("%s%d%d",s,&t,&k);
        ins(c,t-last,1);
        if(s[0]=='+')
        c+=k;
        else
        c-=k;
        last=t;
    }
    for(int i=0;i<q;i++)
    {
        int x;
        scanf("%d",&x);
        if(-x>c)
        ans[i]=-1;
        else
        ins(-x,i,2);
    }
    sort(a,a+num,cmp);
    long long sum=0,t=0;
    last=0;
    for(int i=0;i<num;i++)
    {
//      printf("%d %d %d\n",a[i].x,a[i].y,a[i].type);
        sum+=t*(a[i].x-last);
        if(a[i].type==1)
        t+=a[i].y;
        else
        ans[a[i].y]=sum;
        last=a[i].x;
    }
    for(int i=0;i<q;i++)
    if(ans[i]==-1)
    puts("INFINITY");
    else
    printf("%lld\n",ans[i]);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值