BZOJ4843 [Neerc2016]Expect to Wait

来源:互联网 发布:手机pdf语音朗读软件 编辑:程序博客网 时间:2024/06/05 02:16

答案等于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 1000000000struct 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 20 3 1 2*/


原创粉丝点击