Submission details
Task:Lisäykset
Sender:Metabolix
Submission time:2025-11-29 12:35:05 +0200
Language:C++ (C++20)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED20
#2ACCEPTED33
#3ACCEPTED47
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 2, 3details
#2ACCEPTED0.00 s1, 2, 3details
#3ACCEPTED0.00 s1, 3details
#4ACCEPTED0.00 s1, 3details
#5ACCEPTED0.01 s1, 3details
#6ACCEPTED0.07 s2, 3details
#7ACCEPTED0.07 s3details
#8ACCEPTED0.07 s3details
#9ACCEPTED0.08 s3details
#10ACCEPTED0.21 s3details
#11ACCEPTED0.19 s3details

Code

#include <bits/stdc++.h>

using namespace std;

struct kohta_t {
    int lisäys;
    int määrä;
};

bool debug = 0;
void printtaa(const map<int, kohta_t>& data) {
    if (!debug) return;
    int luku = 0, määrä = 0;
    for (const auto& [_, kohta] : data) {
        luku += kohta.lisäys;
        for (int i = 0; i < kohta.määrä; ++i) {
            cout << luku << " ";
            määrä += 1;
        }
        cout << "| ";
    }
    cout << " (" << määrä << ")\n";
}

vector<int> brute_force(const map<int, int>& määrät, const vector<int>& muutokset) {
    multiset<int> luvut;
    for (const auto& [luku, määrä] : määrät) {
        for (int i = 0; i < määrä; ++i) {
            luvut.insert(luku);
        }
    }

    for (int muutettavia : muutokset) {
        vector<int> temp;
        for (int j = 0; j < muutettavia; ++j) {
            temp.push_back(*luvut.begin());
            luvut.erase(luvut.begin());
        }
        for (int x : temp) {
            luvut.insert(x + 1);
        }
    }

    return vector<int>(luvut.begin(), luvut.end());
}

vector<int> ratkaisu(const map<int, int>& määrät, const vector<int>& muutokset) {
    map<int, kohta_t> data;
    int kohta = 0, luku0 = 0;
    for (const auto& [luku, määrä] : määrät) {
        data[kohta] = {luku - luku0, määrä};
        kohta += määrä;
        luku0 = luku;
    }
    data[kohta] = {(int) muutokset.size() + 1, 0};

    for (int muutettavia : muutokset) {
        if (debug) cerr << muutettavia << "\n";
        printtaa(data);
        data.begin()->second.lisäys += 1;

        auto it = data.upper_bound(muutettavia);
        --it;
        it->second.lisäys -= 1;
        printtaa(data);

        muutettavia -= it->first;
        if (muutettavia > 0) {
            int ei_muutettavia = it->second.määrä - muutettavia;
            data.insert({it->first + ei_muutettavia, {1, muutettavia}});
            it->second.määrä = ei_muutettavia;

            auto it2 = next(next(it));
            if (it2 != data.end()) {
                it2->second.lisäys -= 1;
                printtaa(data);
                if (it2->second.lisäys == 0) {
                    prev(it2)->second.määrä += it2->second.määrä;
                    data.erase(it2);
                }
                printtaa(data);
            }
        }
        if (it != data.begin() && it->second.lisäys == 0) {
            prev(it)->second.määrä += it->second.määrä;
            data.erase(it);
            printtaa(data);
        }
    }

    vector<int> tulos;
    int luku = 0;
    for (const auto& [_, kohta] : data) {
        luku += kohta.lisäys;
        for (int i = 0; i < kohta.määrä; ++i) {
            tulos.push_back(luku);
        }
    }
    return tulos;
}

void kisa_main() {
    int n, m;
    cin >> n >> m;

    vector<int> luvut(n);
    for (int i = 0; i < n; ++i) {
        cin >> luvut[i];
    }

    vector<int> muutokset(m);
    for (int i = 0; i < m; ++i) {
        cin >> muutokset[i];
    }

    map<int, int> määrät;
    for (int i = 0; i < n; ++i) {
        määrät[luvut[i]]++;
    }

    vector<int> tulos = ratkaisu(määrät, muutokset);

    for (int luku : tulos) {
        cout << luku << " ";
    }
    cout << "\n";
}

void fuzz_main() {
    while (1) {
        int n = rand() % 20 + 1;
        int m = rand() % 20 + 1;
        multiset<int> luvut;
        for (int i = 0; i < n; ++i) {
            luvut.insert(rand() % 10);
        }
        vector<int> muutokset(m);
        for (int i = 0; i < m; ++i) {
            muutokset[i] = rand() % n + 1;
        }

        map<int, int> määrät;
        for (int i: luvut) {
            määrät[i]++;
        }

        cerr << n << " " << m << "\n";
        for (int i: luvut) {
            cerr << i << " ";
        }
        cerr << "\n";
        for (int i: muutokset) {
            cerr << i << " ";
        }
        cerr << "\n";
        vector<int> tulos = ratkaisu(määrät, muutokset);
        vector<int> tarkastus = brute_force(määrät, muutokset);

        if (tulos != tarkastus) {
            cerr << "VIRHE!\n";
            return;
        }
        cerr << "OK!\n";
    }
}

void test_main() {
    debug = 1;
    int n, m;
    cin >> n >> m;

    vector<int> luvut(n);
    for (int i = 0; i < n; ++i) {
        cin >> luvut[i];
    }

    vector<int> muutokset(m);
    for (int i = 0; i < m; ++i) {
        cin >> muutokset[i];
    }

    map<int, int> määrät;
    for (int i = 0; i < n; ++i) {
        määrät[luvut[i]]++;
    }

    vector<int> tulos = ratkaisu(määrät, muutokset);
    vector<int> tarkastus = brute_force(määrät, muutokset);

    for (int luku : tulos) {
        cout << luku << " ";
    }
    cout << "\n";
    for (int luku : tarkastus) {
        cout << luku << " ";
    }
    cout << "\n";
}

int main() {
    kisa_main();
}

Test details

Test 1

Group: 1, 2, 3

Verdict: ACCEPTED

input
1 1000
0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
1000 

user output
1000 

Test 2

Group: 1, 2, 3

Verdict: ACCEPTED

input
1000 1000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
511 511 511 511 511 511 511 51...

user output
511 511 511 511 511 511 511 51...

Test 3

Group: 1, 3

Verdict: ACCEPTED

input
1000 1000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
495 495 495 495 495 495 495 49...

user output
495 495 495 495 495 495 495 49...

Test 4

Group: 1, 3

Verdict: ACCEPTED

input
1000 1000
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 ...

correct output
562 562 562 562 562 562 562 56...

user output
562 562 562 562 562 562 562 56...

Test 5

Group: 1, 3

Verdict: ACCEPTED

input
1000 1000
0 1 3 4 6 9 9 9 10 11 11 11 11...

correct output
997 997 997 997 997 998 998 99...

user output
997 997 997 997 997 998 998 99...

Test 6

Group: 2, 3

Verdict: ACCEPTED

input
100000 100000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
50033 50033 50033 50033 50033 ...

user output
50033 50033 50033 50033 50033 ...

Test 7

Group: 3

Verdict: ACCEPTED

input
100000 100000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
49996 49996 49996 49996 49996 ...

user output
49996 49996 49996 49996 49996 ...

Test 8

Group: 3

Verdict: ACCEPTED

input
100000 100000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
50057 50057 50057 50057 50057 ...

user output
50057 50057 50057 50057 50057 ...

Test 9

Group: 3

Verdict: ACCEPTED

input
100000 100000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

correct output
50536 50536 50536 50536 50536 ...

user output
50536 50536 50536 50536 50536 ...

Test 10

Group: 3

Verdict: ACCEPTED

input
100000 100000
0 4 7 29 33 44 52 75 77 79 82 ...

correct output
100000 100001 100003 100023 10...

user output
100000 100001 100003 100023 10...

Test 11

Group: 3

Verdict: ACCEPTED

input
100000 100000
1 12 14 16 49 59 59 63 68 73 8...

correct output
100001 100010 100012 100014 10...

user output
100001 100010 100012 100014 10...