Submission

Status:

(PPPPPPPPPPPPP-)(PPPPPPPPPP-)(PPPPPPPPP)(PPPPP-SSSS)(PPPPP-SSSS)(PPPP-SSSSSSSSS)(PPPPP-SSSSSSSSSSSSSSSS)

Subtask/Task Score:

{0/5}{0/7}{8/8}{0/12}{0/16}{0/28}{0/24}

Score: 8

User: mydKN

Problemset: แคง (Kang)

Language: cpp

Time: 1.956 second

Submitted On: 2025-06-30 12:41:27

#include <bits/stdc++.h>

#pragma GCC optimize("Ofast", "unroll-loops")
#pragma GCC target("avx2")

using namespace std;

#define ll long long
#define emp emplace_back
#define em emplace
#define pb push_back

struct stc{
    ll val, w;
    bool operator<(const stc &o) const{
        return w < o.w;
    }
};

unordered_map<ll, ll> mp;
unordered_map<ll, bool> found;
priority_queue<stc> pq;
vector<ll> res;
ll sum;

vector<ll> capsize(vector<int> A, vector<int> B){
    res.reserve((int)B.size());
    mp.reserve(A.size()+B.size());
    found.reserve(A.size()+B.size());
    for(auto e : A){
        ++mp[e];
    }
    for(auto [e, x] : mp){
        ll tmp = e * x;
        pq.push({e, tmp});
        sum += tmp;
    }
    // cout << sum << "\n";
    for(auto e : B){
        // if(sum <= 0ll || pq.empty()) break;
        if(!found[e]){
            sum += e;
            int tmp = ++mp[e];
            pq.push({e, tmp * e});
        }
        while(!pq.empty()){
            ll curw = mp[pq.top().val] * pq.top().val;
            if(found[pq.top().val] || pq.top().w != curw) pq.pop();
            else break;
        }
        if(!pq.empty()){
            sum -= pq.top().w;
            found[pq.top().val] = 1;
            pq.pop();
        }
        res.emp(max(0ll, sum));
    }
    while(res.size() < B.size()) res.emp(0ll);
    return res;
}
/*
int main() {
	int n, m;
	vector<int> A, B;
	cin >> n >> m;
	A.resize(n);
	B.resize(m);
	for(auto &e : A) cin >> e;
	for(auto &e : B) cin >> e;
	vector<ll> vec = capsize(A, B);
	for(auto e : vec) cout << e << " ";
}
*/