Submission #886381

#TimeUsernameProblemLanguageResultExecution timeMemory
886381dong_liuSuper Dango Maker (JOI22_dango3)C++17
100 / 100
175 ms852 KiB
#include <bits/stdc++.h> using namespace std; #define ar array #define sz(v) int(std::size(v)) using i64 = long long; using pii = pair<int, int>; int s(int n) { return n/40; } int calc(int l, int r) { if (s(r) == s(l-1)) return 1; if (l == r) return 1; int m = (l+r)/2; return 1+calc(l,m)+calc(m+1,r); } #ifdef LOCAL int n, m, a[int(1e4)+1]; int Query(vector<int> v) { vector<int> c(n); for (int i : v) c[a[i]-1]++; // for (int i : v) cout << i << ' '; // cout << "| GOT " << *min_element(begin(c),end(c)) << endl; return *min_element(begin(c),end(c)); } void Answer(vector<int> v) { for (int x : v) cout << x << ' '; cout << endl; } #else #include "dango3.h" #endif mt19937 rng(1234); vector<int> operator+(const vector<int> one, vector<int> two) { for (int x : one) two.push_back(x); return two; } void Solve(int n, int m) { vector<int> v; for (int i = 1; i <= n*m; i++) v.push_back(i); for (int it = 0; it < m; it++) { for (int i = 0; i < sz(v); i++) swap(v[i], v[rng()%(i+1)]); int low = n, hi = sz(v); while (low < hi) { int mid = (low+hi)/2; if (Query(vector(begin(v), begin(v)+mid))) hi = mid; else low = mid+1; } vector base(begin(v), begin(v)+low); vector<int> good, bad; for (int i = low-1; i >= 0; i--) { int j = v[i]; if (Query(vector(begin(v), begin(v)+i) + good)) bad.push_back(j); else good.push_back(j); } bad = bad + vector(begin(v)+low, end(v)); assert(sz(good) == n); Answer(good); v = bad; } } #ifdef LOCAL int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i = 1; i <= n*m; i++) cin >> a[i]; Solve(n, m); } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...