【BZOJ4843】[Neerc2016]Expect to Wait

Description

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

Input

第一行两个整数n,q(1<=n,q<=100000),表示有n个时刻有借书还书的情况,以及有q个询问。
接下来n行,每行表示一个操作,操作如下:
1."+ t k" 在t时刻有k本书被还回来。
2."- t k" 在t时刻有k个人来借书。
(1<=t<=1e9,1<=k<=10000)
输入顺序保证t递增。
接下来一行q个数,第i个数bi(1<=bi<=1e9)表示图书馆初始有bi本书,询问所有人的等待时间之和为多少。

Output

一共q行,每行一个数表示等待时间之和,如果存在一个人根本拿不到书,则输出INFINITY。

Sample Input

5 4
- 1 1
- 2 2
+ 4 1
- 6 1
+ 7 2
0 3 1 2

Sample Output

INFINITY
0
8
3

题解:将借书看成+x,换书看成-x,然后在时间轴上求前缀和,发现那些权值>0的线段的加权长度即时总等待时间。那么如果初始有y本书呢?则我们只需要计算所有权值>y的线段的加权长度。将所有线段排个序即可。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=100010;
int n,m,tot;
ll sum,sv,sl;
char str[10];
ll ans[maxn],t[maxn];
struct node
{
ll val,len;
}p[maxn];
struct query
{
int org;
ll val;
}q[maxn];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmp1(node a,node b)
{
return a.val>b.val;
}
bool cmp2(query a,query b)
{
return a.val>b.val;
}
int main()
{
n=rd(),m=rd();
int i,j,a;
for(i=1;i<=n;i++)
{
scanf("%s",str),t[i]=rd(),a=rd();
if(sum>0) p[++tot].val=sum,p[tot].len=t[i]-t[i-1];
if(str[0]=='+') a=-a;
sum+=a;
}
for(i=1;i<=m;i++) q[i].val=rd(),q[i].org=i;
sort(p+1,p+tot+1,cmp1);
sort(q+1,q+m+1,cmp2);
for(i=j=1;i<=m;i++)
{
for(;p[j].val>q[i].val&&j<=tot;j++) sv+=p[j].val*p[j].len,sl+=p[j].len;
if(q[i].val<sum) ans[q[i].org]=-1;
else ans[q[i].org]=sv-sl*q[i].val;
}
for(i=1;i<=m;i++)
{
if(ans[i]==-1) printf("INFINITY\n");
else printf("%lld\n",ans[i]);
}
return 0;
}

【BZOJ4843】[Neerc2016]Expect to Wait 排序的更多相关文章

  1. bzoj4843 [Neerc2016]Expect to Wait

    [Neerc2016]Expect to Wait Time Limit: 10 Sec Memory Limit: 128 MB Description ls最近开了一家图书馆,大家听说是ls开的, ...

  2. 「Neerc2016」Expect to Wait

    题目描述 ls最近开了一家图书馆,大家听说是ls开的,纷纷过来借书,自然就会出现供不应求的情况, 并且借书的过程类 似一个队列,每次有人来借书就将它加至队尾,每次有人来还书就把书借给队头的若干个人,定 ...

  3. Perl小知识点之排序sort

    脚本这种东西,就是要常用,否则一段时间不用就生疏了,因此决定时时记一些小知识点,一来回顾一下,二来需要的时候可以迅速获得提示. Sort by number You could now write a ...

  4. PHP 使用用户自定义的比较函数对数组中的值进行排序

    原文:PHP 使用用户自定义的比较函数对数组中的值进行排序 usort (PHP 4, PHP 5) usort —      使用用户自定义的比较函数对数组中的值进行排序 说明       bool ...

  5. April Fools Contest 2017 题解&源码(A,数学 B,数学 C,数学 D,字符串 E,数字逻辑 F,排序,卡时间,G,数学)

    A. Numbers Joke time limit per test:2 seconds memory limit per test:64 megabytes input:standard inpu ...

  6. [LeetCode] Max Chunks To Make Sorted II 可排序的最大块数之二

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  7. 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序

    显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填. 但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size ...

  8. 剑指offer——面试题25:合并两个 排序的链表

    自己答案: ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2) { if(pHead1==nullptr&& ...

  9. Expect使用小记

    By francis_hao    May 31,2017   本文翻译了部分Expect的man手册,只选取了个人常用的功能,因此并不完善.   Expect是一个可以和交互式程序对话的程序 概述 ...

随机推荐

  1. 腾讯云使用liveRoom开启直播时,报“房间已存在”错误?

    利用腾讯云roomService服务,移动直播,创建房间api,CreateRoom时有时报“房间已存在”错误. 分析流程发现,CreateRoom会传入roomId到roomService后台,后台 ...

  2. POJ 3070 Fibonacci【斐波那契数列/矩阵快速幂】

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17171   Accepted: 11999 Descr ...

  3. Codeforces 482B Interesting Array(线段树区间更新)

    题目链接 Interesting Array 区间更新.然后对于每一个约数重新求一遍区间的&值,不符合就跳出. #include <bits/stdc++.h> using nam ...

  4. TensorFlow——Checkpoint为模型添加检查点

    1.检查点 保存模型并不限于在训练模型后,在训练模型之中也需要保存,因为TensorFlow训练模型时难免会出现中断的情况,我们自然希望能够将训练得到的参数保存下来,否则下次又要重新训练. 这种在训练 ...

  5. Codeforces 815 C Karen and Supermarket

    On the way home, Karen decided to stop by the supermarket to buy some groceries. She needs to buy a ...

  6. 深入浅出 Cocoa 之 Core Data(3)- 使用绑定

    深入浅出 Cocoa 之 Core Data(3)- 使用绑定 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 前面讲解了 Core Data 的框架, ...

  7. Start Developing iOS Apps Today

    view types - view常见类型

  8. 快速乘法,幂计算 hdu5666

    在实际应用中为了防止数据爆出,在计算a*b%m和x^n%m时,可以采用此方法.在数论中有以下结论: a*b%m=((a%m)*(b*m))%m ; (a+b)%m=(a%m+b%m)%m ; _int ...

  9. 更换 mac时 开发证书

    更换 mac时 开发证书,先导出, 后导入,如果出现错误,把projects自动签名改为手动

  10. 115. distinct subsequence leetcode python

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...