Submission #434511

#TimeUsernameProblemLanguageResultExecution timeMemory
434511yuto1115Comparing Plants (IOI20_plants)C++17
14 / 100
4046 ms14532 KiB
#include "plants.h"
#include <bits/stdc++.h>
#define rep(i, n) for(ll i = 0; i < ll(n); i++)
#define rep2(i, s, n) for(ll i = ll(s); i < ll(n); i++)
#define rrep(i, n) for(ll i = ll(n)-1; i >= 0; i--)
#define pb push_back
#define eb emplace_back
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
using namespace std;
using ll = long long;
using P = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;
using vp = vector<P>;
using vvp = vector<vp>;
using vb = vector<bool>;
using vvb = vector<vb>;
using vs = vector<string>;
const int inf = 1001001001;
const ll linf = 1001001001001001001;

template<class T>
bool chmin(T &a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}

template<class T>
bool chmax(T &a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}

int k, n;
vi r;
vi p;

void init(int _k, vi _r) {
    k = _k;
    r = _r;
    n = r.size();
    p.resize(n);
    set<int> st;
    auto check = [&](int i) {
        assert(st.count(i));
        auto it = st.lower_bound(i);
        if (it == st.begin()) {
            it = st.end();
            i += n;
        }
        it--;
        return i - *it >= k;
    };
    rep(i, n) if (!r[i]) st.insert(i);
    int nx = -1;
    for (int i : st) if (check(i)) nx = i;
    assert(nx != -1);
    rrep(t, n) {
        p[nx] = t;
        if (!t) break;
        vi can;
        auto it = st.lower_bound(nx);
        it++;
        if (it == st.end()) it = st.begin();
        if (*it != nx) can.pb(*it);
        st.erase(nx);
        rep(_, k - 1) {
            if (--nx < 0) nx += n;
            if (--r[nx] == 0) {
                st.insert(nx);
                can.pb(nx);
            }
        }
        nx = -1;
        for (int j : can) if (check(j)) nx = j;
        assert(nx != -1);
    }
}

int compare_plants(int x, int y) {
    return (p[x] > p[y] ? 1 : -1);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...