제출 #1263731

#제출 시각아이디문제언어결과실행 시간메모리
1263731kustov_vadim_533Modern Machine (JOI23_ho_t5)C++20
3 / 100
3093 ms836 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; #define len(v) (int)((v).size()) template<typename T> ostream& operator<<(ostream& out, const vector<T> &a){ for (auto& x : a){ out << x << ' '; } out << '\n'; return out; } template<typename T> istream& operator>>(istream& in, vector<T> &a){ for (size_t i = 0; i < a.size(); ++i){ in >> a[i]; } return in; } mt19937 gen; struct obj{ int sum = 0; char add = 'N'; obj() = default; obj(char x) : sum(x == 'R') {}; }; const int sz = 1 << 20; obj tree[sz]; void push(int v, int ln){ if (tree[v].add == 'N') return; if (ln > 1){ tree[v * 2].add = tree[v].add; tree[v * 2 + 1].add = tree[v].add; } tree[v].sum = (int)(tree[v].add == 'R') * ln; tree[v].add = 'N'; } void upd(int v, int l, int r, int ql, int qr, char qx){ push(v, r - l); if (l >= qr || ql >= r) return; if (l >= ql && r <= qr){ tree[v].add = qx; push(v, r - l); return; } int m = (l + r) / 2; upd(v * 2, l, m, ql, qr, qx); upd(v * 2 + 1, m, r, ql, qr, qx); tree[v].sum = tree[v * 2].sum + tree[v * 2 + 1].sum; } int sum(int v, int l, int r, int ql, int qr){ push(v, r - l); if (l >= qr || ql >= r) return 0; if (l >= ql && r <= qr) return tree[v].sum; int m = (l + r) / 2; int r1 = sum(v * 2, l, m, ql, qr); int r2 = sum(v * 2 + 1, m, r, ql, qr); return r1 + r2; } int find1(int v, int l, int r, int k){ push(v, r - l); if (r - l == 1){ if (k > tree[v].sum) return r; return l; } int m = (l + r) / 2; push(v * 2, m - l); if (tree[v * 2].sum >= k) return find1(v * 2, l, m, k); else return find1(v * 2 + 1, m, r, k - tree[v * 2].sum); } int find0(int v, int l, int r, int k){ push(v, r - l); if (r - l == 1){ if (k > r - l - tree[v].sum) return r; return l; } int m = (l + r) / 2; push(v * 2, m - l); if (m - l - tree[v * 2].sum >= k) return find0(v * 2, l, m, k); else return find0(v * 2 + 1, m, r, k - (m - l - tree[v * 2].sum)); } void build(int v, int l, int r, vector<char>& a){ tree[v].add = 'N'; if (r - l == 1){ tree[v] = obj(a[l]); return; } int m = (l + r) / 2; build(v * 2, l, m, a); build(v * 2 + 1, m, r, a); tree[v].sum = tree[v * 2].sum + tree[v * 2 + 1].sum; } inline void solve() { int n, m; cin >> n >> m; vector<char> c(n); vector<int> a(m); for (int i = 0; i < n; ++i){ cin >> c[i]; } for (int j = 0; j < m; ++j){ cin >> a[j]; --a[j]; } int q; cin >> q; for (int j = 0; j < q; ++j){ int l, r; cin >> l >> r; --l, --r; build(1, 0, n, c); for (int f = l; f <= r; ++f){ upd(1, 0, n, a[f], a[f] + 1, 'R'); int v = a[f]; int k, u; while (v >= 0 && v < n){ if (sum(1, 0, n, v, v + 1) == 0){ k = sum(1, 0, n, 0, v + 1); u = -1; if (k > 0){ u = find1(1, 0, n, k); } upd(1, 0, n, u + 1, v + 1, 'R'); v = u; } else{ k = v + 1 - sum(1, 0, n, 0, v + 1); u = find0(1, 0, n, k + 1); upd(1, 0, n, v, u, 'B'); v = u; } } } cout << sum(1, 0, n, 0, n) << '\n'; } } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cout.precision(60); int t = 1; // cin >> t; while (t--) { solve(); } }
#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...