VK Cup 2018 - Round 1 B. Producing Snow (优先队列+前缀和)

原题地址:http://codeforces.com/contest/923/problem/B

题意:有个人每天都会弄一堆雪在院子里面,然后天气很热,每天雪都会融化当前温度的体积,直到这堆雪融化完了,问你每天会融化多少雪。

思路:用优先队列维护每一堆雪,注意每一堆雪都要加上之前的重量,这样主要是便于处理,只要堆顶元素比当前前缀和小,那么就可以出队列了.

#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cout<<"["<<"x = "<<(x)<<"] "
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 998244353;
int n;
int v[maxn], t[maxn];
ll sum[maxn];
ll ans[maxn];
priority_queue<ll,vector<ll>, greater<ll> >q;
int main() {
    scanf ("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf ("%d", &v[i]);
    }
    for (int i = 1; i <= n; i++) {
        scanf ("%d", &t[i]);
        sum[i] = sum[i - 1] + t[i];//前缀和
    }
    for (int i = 1; i <= n; i++) {
        ll ans = 0;
        q.push (v[i] + sum[i - 1]);//要加上前缀和
        while (!q.empty() && q.top() <= sum[i]){
            ans += q.top() - sum[i - 1];//表示当前所融化的
            q.pop();
        }
        ans += q.size() * t[i];//还没融化的统一处理
        printf ("%I64d ", ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/81604699