答案等于sigma 每个时间在等待的人数
那么我们现在认为等待的人数可以是负数,为负就代表剩了这么多书
那么答案就是sigma 每个在等待的人数是正数的时间的等待人数
假设初始书量为0,我们计算每个时刻的等待人数
增加初始书量就相当于给每个时刻等待人数都减少一个值
求前缀和一类的东西之后把所有询问排序扫一遍即可
#include<iostream>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstdlib>
#include<cstdio>
#include<map>
#include<bitset>
#include<set>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 100010
#define MAXM 1010
#define ll long long
#define eps 1e-8
#define MOD 1000000007
#define INF 1000000000
struct data{
int v;
int l;
friend bool operator <(data x,data y){
return x.v<y.v;
}
};
int n,m;
char o[MAXN][2];
int t[MAXN],k[MAXN];
int lst;
data a[MAXN],b[MAXN];
ll ans[MAXN];
ll s[MAXN];
ll sl[MAXN];
int main(){
int i;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%s%d%d",o[i],&t[i],&k[i]);
if(o[i][0]=='-'){
k[i]*=-1;
}
}
int now=k[1];
for(i=2;i<=n;i++){
a[i-1].v=now;
a[i-1].l=t[i]-t[i-1];
now+=k[i];
}
lst=now;
sort(a+1,a+n);
for(i=1;i<n;i++){
s[i]=s[i-1]+(ll)a[i].v*a[i].l;
sl[i]=sl[i-1]+a[i].l;
}
for(i=1;i<=m;i++){
scanf("%d",&b[i].v);
b[i].l=i;
}
sort(b+1,b+m+1);
int wzh=n-1;
for(i=1;i<=m;i++){
if(lst+b[i].v<0){
ans[b[i].l]=-1;
continue ;
}
while(wzh&&a[wzh].v+b[i].v>0){
wzh--;
}
ans[b[i].l]=-s[wzh]-sl[wzh]*b[i].v;
}
for(i=1;i<=m;i++){
if(ans[i]==-1){
printf("INFINITY\n");
}else{
printf("%lld\n",ans[i]);
}
}
return 0;
}
/*
5 4
- 1 1
- 2 2
+ 4 1
- 6 1
+ 7 2
0 3 1 2
*/