陈题。好题。补档。复习。
题意: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]);
}