[Neerc2016]Expect to Wait

Time Limit: 10 Sec Memory Limit: 128 MB

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\)个数\(b_i(1<=b_i<=1e9)\)表示图书馆初始有\(b_i\)本书,询问所有人的等待时间之和为多少。

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\)

不要问我为什么是数据结构。。。。据说可以用线段树???(雾)

好了,来讲一讲这道题。。。。

最开始头是真的铁。。。。。我就要在线操作。。。。我就要!!!!

凉凉夜色为你思念成河????

然后我们只有来重新看这道题。。。。

我们首先把这道题转化一下,我们用正数和负数来分别表示两种情况。。。。正数的意思是你现在有多少本书。。。。负数的意思是现在有多少个人在等。。。。。

感觉很友好的翻译了一下题目。

那么我们要求的是一个数列中,有多少个小于0的数(每个数分别乘上它对应的权值)。

然而你会发现不是那么友好。。。。显然坑坑洼洼,七零八碎的。。。。怎么统计啊。。。。

但是你又会发现每次询问都是对于整个数列的,,整个,,整个。。。。。。

也就是说,数列的顺序并没有什么影响。

排序啊!!!!

排序的好处在于,整个数列是单调递增的以后,需要你统计的答案就变成连续一段的了。。。

维护前缀和来统计答案吧。。。。。

把询问离线下来,排个序。也满足单调性啦~~~

具体看代码的啦(结构体有一点鬼畜,yy一下就好)


#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
struct lpl{
int num, len;
bool operator < (const lpl &aaa)const{
return num < aaa.num;
}
}a[maxn], b[maxn], lin[maxn];
int n, q, last, cnt;
long long ans[maxn], s[maxn], sl[maxn];
char mark[911]; inline void putit()
{
scanf("%d%d", &n, &q);
for(int i = 1; i <= n; ++i){
scanf("%s%d%d", mark, &lin[i].num, &lin[i].len);
if(mark[0] == '-') lin[i].len = -lin[i].len;
a[i].num = a[i - 1].num + lin[i].len;
a[i - 1].len = lin[i].num - lin[i - 1].num;
}
} inline void workk()
{
last = a[n].num; sort(a + 1, a + n + 1);
for(int i = 1; i <= n; ++i){
s[i] = s[i - 1] + (long long)a[i].num * a[i].len;
sl[i] = sl[i - 1] + a[i].len;
}
for(int i = 1; i <= q; ++i) scanf("%d", &b[i].num), b[i].len = i;
sort(b + 1, b + q + 1); int cnt = n;
for(int i = 1; i <= q; ++i){
if(last + b[i].num < 0){ans[b[i].len] = -1; continue;}
while(cnt && a[cnt].num + b[i].num > 0) cnt--;
ans[b[i].len] = -s[cnt] - b[i].num * sl[cnt];
} } inline void print()
{
for(int i = 1; i <= q; ++i)
if(ans[i] == -1) printf("INFINITY\n");
else printf("%lld\n", ans[i]);
} int main()
{
putit();
workk();
print();
return 0;
}

bzoj4843 [Neerc2016]Expect to Wait的更多相关文章

  1. 【BZOJ4843】[Neerc2016]Expect to Wait 排序

    [BZOJ4843][Neerc2016]Expect to Wait Description ls最近开了一家图书馆,大家听说是ls开的,纷纷过来借书,自然就会出现供不应求的情况, 并且借书的过程类 ...

  2. 「Neerc2016」Expect to Wait

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

  3. expect用法

    1. [#!/usr/bin/expect]  这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西.  注意: ...

  4. expect基本使用方法

    参考: http://www.cnblogs.com/lzrabbit/p/4298794.html expect是linux系统中可以和子进程进行交互的一个命令,使用它可以做一些自动化工作.pyth ...

  5. expect实现自动登录

    自动登录主机(ssh) 建脚本item2login.sh,包含如下内容 #!/usr/bin/expect set timeout 30 spawn ssh -p [lindex $argv 0] [ ...

  6. 自动化运维 Expect

      Mac 下载:brew install homebrew/dupes/expect expect : ->  自动化脚本工具:  用于处理交互命令; #注意 调用时并不是使用的 /bin/b ...

  7. expect

    #!/usr/bin/expect -fset ipaddr "192.168.5.4"set passwd "123qwe"set timeout 30 sp ...

  8. expect命令问题1

    [root@localhost scripts]# cat exptest.sh #!/usr/bin/expect spawn ssh root@127.0.0.1 expect "pas ...

  9. expect脚本语言用法示例

    #!/usr/bin/expect set hostname [lindex $argv 0] set username [lindex $argv 1] set passwd [lindex $ar ...

随机推荐

  1. webpack的理解、总结

    weabpck的基础应用 https://blog.zhangjd.me/2016/06/19/webpack-your-bags/ https://juejin.im/post/5cc26dfef2 ...

  2. CAS无锁策略

    并发编程时,对于共享资源的使用需要确保绝对的安全性.除了利用锁机制之外,还有一种无锁的概念.所谓无锁,就是假定在并发情况下,对于共享资源的访问没有冲突,线程可以一直不停的运行,无需阻塞,如果产生冲突, ...

  3. TCP为什么会采用三次握手,若采用二次握手可以吗?

    建立连接的过程是利用C/S(客户机/服务器)模式,假设A为客户端,B为服务器端. TCP是采用三次握手进行连接的,简要说明该过程: (1) A向B发送连接请求 (2) B对收的的A的报文段进行确认 ( ...

  4. spring cloud学习笔记四 熔断器Hystrix

    我们知道分布式服务有这样一个特点,每一个微服务都有自己的业务,并且很多时候一个微服务的业务要依赖于其他微服务,如果这些相互关联的微服务中其中某个微服务请求失败时,就会导致其他调用它的微服务也会请求失败 ...

  5. day19 python模块 json模块 pickle模块

    day19 python   一.序列化模块     序列类型: 列表 字符串 元组 bytes     序列化: 特指字符串和bytes, 就是把其他的数据类型转化成序列的数据类型的过程 dic = ...

  6. javascript中数组元素删除方法splice,用在for循环中巨坑

    一.demo splice: 该方法会改变自动原始数组长度 实例: var array = ["aa","dd","cc","aa ...

  7. Maven项目的pom.xml配置文件格式初识

    Maven项目 有pom.xml文件的项目就已经是一个maven项目了,但是还没有被maven托管,我们需要将该项目添加为maven项目 <project xmlns="http:// ...

  8. HTTP协议-get请求与post请求的区别

    区别: 参数:get通过url进行传递:post放在request body中 长度:get请求在url的长度是有限制的:而post没有(其实这个限制是来自浏览器和web服务器对url的限制,并不是h ...

  9. UITableViewCell的移动

    看到Metro大都会 这个App中扣款顺序有个cell可以移动,于是觉得是时候回忆一下UITableView的基本使用了.其实他这个移动cell的功能是系统自带的. 代码主要是这样: // // Vi ...

  10. 【BZOJ2555】SubString(后缀自动机,LCT)

    题意:给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作. 长度 <= ...