Submission #198017

#TimeUsernameProblemLanguageResultExecution timeMemory
198017wleung_bvgDrvca (COCI19_drvca)C++14
110 / 110
193 ms7504 KiB
#include <bits/stdc++.h>
using namespace std;
template<class C>constexpr int sz(const C&c){return int(c.size());}
using ll=long long;constexpr const char nl='\n',sp=' ';

const int MAXN = 1e5 + 5;

int N, H[MAXN];
map<int, int> vals, diffs;

void add(int v) {
    auto cur = vals.find(v);
    if (cur != vals.end()) {
        ++cur->second;
        ++diffs[0];
        return;
    }
    auto nxt = vals.upper_bound(v);
    if (nxt != vals.begin() && nxt != vals.end()) {
        auto it = diffs.find(nxt->first - prev(nxt)->first);
        if (--it->second == 0) diffs.erase(it);
    }
    cur = vals.emplace_hint(nxt, v, 1);
    if (nxt != vals.end()) ++diffs[nxt->first - v];
    if (cur != vals.begin()) ++diffs[v - prev(cur)->first];
}

void rem(int v) {
    auto cur = vals.find(v);
    if (cur->second >= 2) {
        --cur->second;
        auto it = diffs.find(0);
        if (--it->second == 0) diffs.erase(it);
        return;
    }
    auto nxt = next(cur);
    if (nxt != vals.end()) {
        auto it = diffs.find(nxt->first - v);
        if (--it->second == 0) diffs.erase(it);
    }
    if (cur != vals.begin()) {
        auto it = diffs.find(v - prev(cur)->first);
        if (--it->second == 0) diffs.erase(it);
    }
    vals.erase(cur);
    if (nxt != vals.begin()) if (nxt != vals.end()) ++diffs[nxt->first - prev(nxt)->first];
}

bool check(int A, int B) {
    int cur = A, diff = B - A;
    vector<int> reinsert;
    while (true) {
        auto it = vals.lower_bound(cur);
        if (it == vals.end() || it->first != cur) {
            break;
        }
        reinsert.push_back(it->first);
        rem(it->first);
        cur += diff;
        if (sz(diffs) <= 1) {
            vector<int> A, B;
            for (int v : reinsert) A.push_back(v);
            for (auto &&p : vals) for (int i = 0; i < p.second; i++) B.push_back(p.first);
            if (A.empty()) {
                A.push_back(B.back());
                B.pop_back();
            }
            if (B.empty()) {
                B.push_back(A.back());
                A.pop_back();
            }
            assert(sz(A) + sz(B) == N);
            cout << sz(A) << nl;
            for (int i = 0; i < sz(A); i++) cout << A[i] << " \n"[i == sz(A) - 1];
            cout << sz(B) << nl;
            for (int i = 0; i < sz(B); i++) cout << B[i] << " \n"[i == sz(B) - 1];
            return true;
        }
    }
    for (int v : reinsert) add(v);
    return false;
}

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // freopen("err.txt", "w", stderr);
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> N;
    for (int i = 0; i < N; i++) cin >> H[i];
    sort(H, H + N);
    for (int i = 0; i < N; i++) add(H[i]);
    if (check(H[0], H[1])) return 0;
    if (N >= 3 && check(H[0], H[2])) return 0;
    if (N >= 3 && check(H[1], H[2])) return 0;
    cout << -1 << nl;
    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...