제출 #952471

#제출 시각아이디문제언어결과실행 시간메모리
952471badont Martian DNA (BOI18_dna)C++17
100 / 100
72 ms17752 KiB
#include <bits/stdc++.h> using namespace std; // clang-format off template <typename T, typename = void> struct is_iterable : false_type {};template <typename T>struct is_iterable< T, void_t<decltype(begin(declval<T>())), decltype(end(declval<T>()))>> : true_type {};template <typename T>typename enable_if<is_iterable<T>::value && !is_same<T, string>::value,ostream &>::type operator<<(ostream &cout, T const &v);template <typename A, typename B>ostream &operator<<(ostream &cout, pair<A, B> const &p) { return cout << "(" << p.first << ", " << p.second << ")";}template <typename T>typename enable_if<is_iterable<T>::value && !is_same<T, string>::value, ostream &>::type operator<<(ostream &cout, T const &v) { cout << "["; for (auto it = v.begin(); it != v.end();) {cout << *it; if (++it != v.end()) cout << ", "; } return cout << "]";} #ifdef LOCAL void dbg_out() { cout << endl; } template <typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cout << ' ' << H; dbg_out(T...); } #define debug(...) cout << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__) #else #define debug(...) "zzz" #endif // clang-format on using ll = long long; using ld = long double; using pii = pair<ll, ll>; #define all(x) x.begin(), x.end() #define mp make_pair #define pb push_back #define f first #define s second template <typename T, typename Merge = plus<T>> struct seg { int n; vector<T> tr; Merge merge; seg(int n) : n(n), merge(Merge()), tr((n << 2) + 5, T{}){}; seg(const vector<T> &a) : seg((int)a.size()) { function<void(int, int, int)> build = [&](int z, int l, int r) { if (l == r) { tr[z] = a[l]; return; } int mid = (l + r) >> 1; build(2 * z, l, mid); build(2 * z + 1, mid + 1, r); tr[z] = merge(tr[2 * z], tr[2 * z + 1]); }; build(1, 0, n - 1); } void upd(int z, int l, int r, int qg, const T &val) { if (qg == l && qg == r) { tr[z] = val; return; } int mid = (l + r) >> 1; if (qg <= mid) { upd(2 * z, l, mid, qg, val); } else { upd(2 * z + 1, mid + 1, r, qg, val); } tr[z] = merge(tr[2 * z], tr[2 * z + 1]); }; T query(int z, int l, int r, int ql, int qr) { if (ql > qr) return T{}; if (ql == l && qr == r) { return tr[z]; } int mid = (l + r) >> 1; return merge(query(2 * z, l, mid, ql, min(qr, mid)), query(2 * z + 1, mid + 1, r, max(ql, mid + 1), qr)); }; int walk(int z, int l, int r, T quota) { // min location >= x if (tr[z] < quota) return n; if (l == r) { return l; } int mid = (l + r) >> 1; T on_left = tr[2 * z]; if (quota <= on_left) return walk(2 * z, l, mid, quota); return walk(2 * z + 1, mid + 1, r, quota - on_left); } int walk(T quota) { return walk(1, 0, n - 1, quota); } void upd(int g, const T &val) { upd(1, 0, n - 1, g, val); } T query(int l, int r) { return query(1, 0, n - 1, l, r); } }; void solve() { // open int n, k, r; cin >> n >> k >> r; vector<int> a(n); for (auto &u : a) cin >> u; vector<int> val(r), cnt(r); vector<int> req(k); for (int i = 0; i < r; i++) { cin >> val[i] >> cnt[i]; req[val[i]] = cnt[i]; } vector bin(k, vector<int>()); for (int i = 0; i < n; i++) bin[a[i]].pb(i); for (int i = 0; i < k; i++) { if (req[i] > (int)bin[i].size()) { cout << "impossible\n"; return; } } seg<int> tree(n); for (int i = 0; i < k; i++) { if (req[i] > 0) { tree.upd(bin[i][req[i] - 1], 1); } } int ans = tree.walk(r) + 1; debug(ans); for (int i = 1; i < n; i++) { int pi = i - 1; int pv = a[pi]; if (req[pv] > 0) { int old_idx = lower_bound(all(bin[pv]), pi) - bin[pv].begin(); int bin_sz = (int)bin[pv].size(); if (old_idx + req[pv] - 1 < bin_sz) { tree.upd(bin[pv][old_idx + req[pv] - 1], 0); } if (old_idx + req[pv] < bin_sz) { tree.upd(bin[pv][old_idx + req[pv]], 1); } } int idx = tree.walk(r); if (idx < n) { ans = min(ans, idx - i + 1); } } cout << ans << '\n'; } int main() { cin.tie(0)->sync_with_stdio(false); ll T = 1; // cin >> T; for (int t = 0; t < T; t++) solve(); cout.flush(); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

dna.cpp: In function 'void solve()':
dna.cpp:11:22: warning: statement has no effect [-Wunused-value]
   11 |   #define debug(...) "zzz"
      |                      ^~~~~
dna.cpp:132:3: note: in expansion of macro 'debug'
  132 |   debug(ans);
      |   ^~~~~
dna.cpp: In instantiation of 'seg<T, Merge>::seg(int) [with T = int; Merge = std::plus<int>]':
dna.cpp:124:18:   required from here
dna.cpp:28:9: warning: 'seg<int>::merge' will be initialized after [-Wreorder]
   28 |   Merge merge;
      |         ^~~~~
dna.cpp:27:13: warning:   'std::vector<int> seg<int>::tr' [-Wreorder]
   27 |   vector<T> tr;
      |             ^~
dna.cpp:29:3: warning:   when initialized here [-Wreorder]
   29 |   seg(int n) : n(n), merge(Merge()), tr((n << 2) + 5, T{}){};
      |   ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...