bzoj4843 [Neerc2016]Expect to Wait
[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的更多相关文章
- 【BZOJ4843】[Neerc2016]Expect to Wait 排序
[BZOJ4843][Neerc2016]Expect to Wait Description ls最近开了一家图书馆,大家听说是ls开的,纷纷过来借书,自然就会出现供不应求的情况, 并且借书的过程类 ...
- 「Neerc2016」Expect to Wait
题目描述 ls最近开了一家图书馆,大家听说是ls开的,纷纷过来借书,自然就会出现供不应求的情况, 并且借书的过程类 似一个队列,每次有人来借书就将它加至队尾,每次有人来还书就把书借给队头的若干个人,定 ...
- expect用法
1. [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西. 注意: ...
- expect基本使用方法
参考: http://www.cnblogs.com/lzrabbit/p/4298794.html expect是linux系统中可以和子进程进行交互的一个命令,使用它可以做一些自动化工作.pyth ...
- expect实现自动登录
自动登录主机(ssh) 建脚本item2login.sh,包含如下内容 #!/usr/bin/expect set timeout 30 spawn ssh -p [lindex $argv 0] [ ...
- 自动化运维 Expect
Mac 下载:brew install homebrew/dupes/expect expect : -> 自动化脚本工具: 用于处理交互命令; #注意 调用时并不是使用的 /bin/b ...
- expect
#!/usr/bin/expect -fset ipaddr "192.168.5.4"set passwd "123qwe"set timeout 30 sp ...
- expect命令问题1
[root@localhost scripts]# cat exptest.sh #!/usr/bin/expect spawn ssh root@127.0.0.1 expect "pas ...
- expect脚本语言用法示例
#!/usr/bin/expect set hostname [lindex $argv 0] set username [lindex $argv 1] set passwd [lindex $ar ...
随机推荐
- 自定义的最简单的可回调的线程任务CallbackableFeatureTask(模仿google的ListenableFutureTask)
1.使该Task继承Callable,Runable import java.util.concurrent.Callable; import java.util.function.Consumer; ...
- Intellij 选择profile
注意有3个地方需要改
- ahocorasick使用
一.作用 字符串匹配,比如现在有个大的列表,客户输入一句话,如何根据客户输入的一句话,从大列表中匹配出字符串交集 具体请详细查阅 二.示例 比如我们有一个wordlist列表,长度很长,包含43430 ...
- hdu1214 圆桌会议
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1214 HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问 ...
- 机器学习——k-近邻(K-Nearest Neighbor)
目录 K-Nearest neighbor K-近邻分类算法 从文本文件中解析和导入数据 使用python创建扩散图 归一化数值 K-Nearest neighbor (个人观点,仅供参考.) k-近 ...
- java String练习题
package java07; /* 题目: 定义一个方法,把数组{1,2,3}按照指定格式拼接成一个字符串,格式参照如下:[word1#word2#word3] 思路: 1.首先准备一个int[]数 ...
- Center os6.5 mysql
1 # yum -y install mysql-server mysql mysql-dev 2 启动mysql # service mysqld start 3 为root用户配置一个密码 ...
- loj6177 「美团 CodeM 初赛 Round B」送外卖2 最短路+状压dp
题目传送门 https://loj.ac/problem/6177 题解 一直不知道允不允许这样的情况:取了第一的任务的货物后前往配送的时候,顺路取了第二个货物. 然后发现如果不可以这样的话,那么原题 ...
- less和vim中使用正则表达式搜索
使用less查看 txt 文件之后,按\可以正则表达式来搜索: less phonelist.txt (232) 298-2265 (624) 381-1078 (540) 126-1980 (874 ...
- mobx学习笔记03——mobx基础语法(decorator修饰器)
在声明阶段实现类与类成员注解的一种语法. function log(target){ const desc = Object.getOwnPropertyDescriotors(target.prot ...