Submission #1329834

#TimeUsernameProblemLanguageResultExecution timeMemory
1329834lopkus로봇 (IOI13_robots)C++20
100 / 100
1485 ms19072 KiB
#include <bits/stdc++.h>
#include "robots.h"
using namespace std;

int putaway(int n, int m, int t, int _x[], int _y[], int _w[], int _s[]) {
    vector<int> x(n), y(m), w(t), s(t);
    for (int i = 0; i < n; i++) {
        x[i] = _x[i];
    }
    for (int i = 0; i < m; i++) {
        y[i] = _y[i];
    }
    vector<int> ord(t);
    iota(ord.begin(), ord.end(), 0);
    ranges::sort(ord, [&](int i, int j) {
        return _w[i] < _w[j];
    });
    for (int i = 0; i < t; i++) {
        w[i] = _w[ord[i]];
        s[i] = _s[ord[i]];
    }
    ranges::sort(x);
    ranges::sort(y);
    auto good = [&](int k) {
        int pos = 0;
        vector<bool> removed(t);
        priority_queue<pair<int, int>> q;
        for (int i = 0; i < n; i++) {
            int l = pos;
            while (pos < t && w[pos] < x[i]) {
                q.push({s[pos], pos});
                pos++;
            }
            for (int j = 0; j < k; j++) {
                if (q.empty()) break;
                int r = q.top().second;
                q.pop();
                removed[r] = 1;
            }
        }
        vector<int> a;
        for (int i = 0; i < t; i++) {
            if (!removed[i]) {
                a.push_back(s[i]);
            }
        }
        ranges::sort(a);
        int sz = a.size();
        if (1LL * m * k < sz) {
            return false;
        }
        vector<int> b(sz);
        int ptr = m - 1;
        for (int j = sz - 1; j >= 0; j -= k) {
            for (int i = j; i >= max(0, j - k); i--) {
                b[i] = y[ptr];
            }
            ptr--;
            if (ptr == -1) {
                break;
            }
        }
        for (int i = 0; i < sz; i++) {
            if (a[i] >= b[i]) {
                return false;
            }
        }
        return true;
    };
    int tl = 0, tr = t;
    if (!good(t)) {
        return -1;
    }
    while (tl + 1 < tr) {
        int tm = (tl + tr) / 2;
        if (good(tm)) {
            tr = tm;
        } else {
            tl = tm;
        }
    }
    return tr;
}
#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...