Codeforces 948C Producing Snow(优先队列+思维)

题目链接: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?'
':' ');
33     }
34     return 0;
35 }
原文地址:https://www.cnblogs.com/fu3638/p/8543875.html