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?'\n':' ');
33     }
34     return 0;
35 }

 

转载于:https://www.cnblogs.com/fu3638/p/8543875.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值