I - Producing Snow (CodeForces - 948C)
题意:每天堆一堆雪,每一堆雪之间相互独立,每天都有一个温度Vi,雪会融化Vi(如果雪的体积小于Vi,则全部融化).求每一天融化的雪的体积.
做法有二:思维+优先队列&&树状数组+二分
1.思维+优先队列:
题目等价于第一天生产了n堆雪,后面不再生产雪.如下:
10 10 5
5 7 2
等价于
10,5+10,5+7+5 0 0
5 7 2
求温度数组的前缀和(s[i])
依次把10,5+10,5+7+5推入队列,队列的第一个元素和s[i]比较,如果前者小于后者,答案减去sum[i]-q.top().再把该元素pop出去.
代码:
#include<bits/stdc++.h>
#define ll long long
#define maxn 200008
using namespace std;
ll a[maxn];
ll b[maxn];
ll sum[maxn];
priority_queue<ll , vector< ll>,greater<ll> > q;
int main()
{
int n;
scanf("%d",&n);
for(ll i=0;i<n;i++)
scanf("%lld",&a[i]);
for(ll j=0;j<n;j++)
scanf("%lld", &b[j]);
sum[0]=b[0];
for(int i=1;i<n;i++)
sum[i]=sum[i-1]+b[i];
for(int i=0;i<n;i++){
ll ans=0;
q.push(a[i]+sum[i-1]);
ans=b[i]*q.size();
while(!q.empty()&&q.top()<sum[i]){
ans-=(sum[i]-q.top());
q.pop();
}
printf("%lld",ans);
if(i!=n-1)
printf(" ");
else
printf("\n");
}
return 0;
}