Submission #1349822

#TimeUsernameProblemLanguageResultExecution timeMemory
1349822osmiyumData Centers (EGOI22_datacenters)C++20
77 / 100
2093 ms8600 KiB
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

/**
 * EGOI 2022 - DataCenters Çözümü
 * 
 * Strateji: Makine sayılarını ve bu sayıya sahip veri merkezi adetlerini 
 * azalan sırada bir map'te tutuyoruz. Her adımda en yüksek değerli c adet
 * veri merkezini bulup m miktarını çıkarıyoruz ve map'i güncelliyoruz.
 */

int main() {
    // Hızlı I/O için senkronizasyonu kapatıyoruz
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, s;
    if (!(cin >> n >> s)) return 0;

    // map<MakineSayisi, VeriMerkeziAdedi, greater<long long>>
    // greater ile en çok makinesi olan veri merkezleri her zaman en üstte olur.
    map<long long, int, greater<long long>> counts;
    for (int i = 0; i < n; ++i) {
        long long val;
        cin >> val;
        counts[val]++;
    }

    for (int i = 0; i < s; ++i) {
        long long m, c_needed;
        cin >> m >> c_needed;

        // Bu adımda güncellenen makine sayılarını burada biriktirip
        // map döngüsü bittikten sonra toplu ekleyeceğiz.
        vector<pair<long long, int>> to_reinsert;

        while (c_needed > 0) {
            // counts.begin() her zaman mevcut en büyük makine sayısına sahip grubu verir.
            auto it = counts.begin();
            if (it == counts.end()) break;

            long long current_val = it->first;
            int current_count = it->second;

            // Gereken kopya sayısı (c) ile eldeki grup miktarından hangisi azsa onu alıyoruz.
            int take = (c_needed < (long long)current_count) ? (int)c_needed : current_count;

            // Yeni makine sayısı: Mevcut - m
            to_reinsert.push_back({current_val - m, take});

            // Eğer gruptaki herkesi aldıysak sil, yoksa miktarını azalt.
            if (take == current_count) {
                counts.erase(it);
            } else {
                it->second -= take;
            }

            c_needed -= take;
        }

        // Güncellenen değerleri map'e geri ekliyoruz.
        // Aynı değere sahip olanlar otomatik olarak birleşir (counts[val] += count).
        for (auto const& p : to_reinsert) {
            counts[p.first] += p.second;
        }
    }

    // Sonuçları azalan sırada yazdırıyoruz.
    bool first = true;
    for (auto const& entry : counts) {
        for (int i = 0; i < entry.second; ++i) {
            if (!first) cout << " ";
            cout << entry.first;
            first = false;
        }
    }
    cout << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...