题目链接:http://codeforces.com/contest/948/problem/C
题目大意:给定长度n(n<=1e5),第一行v[i]表示表示第i堆雪的体积,第二行t[i]表示第1~i天的雪将要消融的体积,一堆雪如果消融到体积为0则消失,求每天消融的雪的体积。
解题思路:用优先队列,第i天就将v[i]+sum[i-1]放入优先队列中,然后初始消融量ans=t[i]*q.size(),假设每堆雪都够消融,然后根据优先队列找到q.top()<=sum[i]即不够消融的,减掉差值。
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 #include<functional> 6 #include<algorithm> 7 using namespace std; 8 typedef long long LL; 9 const int N=1e5+5; 10 11 LL t[N],sum[N],v[N]; //sum[i]是t[i]的前缀和 12 13 int main(){ 14 priority_queue<LL,vector<LL>,greater<LL> >q; 15 int n,m; 16 scanf("%d",&n); 17 for(int i=1;i<=n;i++){ 18 scanf("%lld",&v[i]); 19 20 } 21 for(int i=1;i<=n;i++){ 22 scanf("%lld",&t[i]); 23 sum[i]=t[i]+sum[i-1]; 24 } 25 for(int i=1;i<=n;i++){ 26 q.push(v[i]+sum[i-1]); //加上sum[i-1],可以在减的时候将前一段没有消融的sum[i-1]抵消掉 27 LL ans=t[i]*q.size(); //先假设没有一堆雪不够消融t[i] 28 while(!q.empty()&&q.top()<=sum[i]){ //找到不够t[i]的,减掉差值(不够的部分) 29 ans+=q.top()-sum[i]; 30 q.pop(); 31 } 32 printf("%lld%c",ans,i==n?'\n':' '); 33 } 34 return 0; 35 }