Cod sursa(job #1839284)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 2 ianuarie 2017 18:04:18
Problema Sate2 Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("sate2.in");
ofstream fout("sate2.out");

struct group {
    int size;
    int s;
    vector <int> v;

    group() {
        size = 0;
        s = 0;
        v = vector <int> ();
    }

    inline void remove(int i) {
        size--;
        s -= v[i];
        swap(v[i], v[size]);
        v.pop_back();
    }

    inline void insert(int x) {
        size++;
        s += x;
        v.push_back(x);
    }

    inline void move(int i, group &to) {
        to.insert(v[i]);
        remove(i);
    }

    inline bool operator <(const group &other) const {
        return s < other.s;
    }
};

bool solve() {
    int n, m, k;

    fin >> n >> m >> k;

    vector <group> c(k);
    mt19937 gen(time(0));
    for (int i = 0, x; i < n; i++) {
        fin >> x;
        c[i % k].insert(x);
    }

    if (m % k != 0)
        return false;

    for (int i = 150000; i > 0; i--) {
        auto max = max_element(begin(c), end(c));
        auto min = min_element(begin(c), end(c));

        if (max->s == min->s)
            return true;

        max->move(gen() % max->size, *min);
    }

    return false;
}

int main() {
    int t;
    fin >> t;
    while (t--)
        fout << (solve() ? "DA\n" : "NU\n");
    return 0;
}