Submission #1044614

#TimeUsernameProblemLanguageResultExecution timeMemory
1044614vjudge1Street Lamps (APIO19_street_lamps)C++17
60 / 100
121 ms7404 KiB
#include <bits/stdc++.h> using i64 = long long; #ifdef DEBUG #include "debug.h" #else #define debug(...) void(23) #endif #define def int mid = (l + r) >> 1, rv = v + ((mid - l + 1) << 1) struct segtree { int n; std::vector<int> tree; segtree(int _n) : n(_n), tree(n << 1) {} void modify(int v, int l, int r, int p, int x) { if(l == r) { tree[v] = x; return; } def; if(p <= mid) { modify(v + 1, l, mid, p, x); } else { modify(rv, mid + 1, r, p, x); } tree[v] = std::max(tree[v + 1], tree[rv]); } void modify(int p, int x) { assert(0 <= p && p < n); modify(0, 0, n - 1, p, x); } int query(int v, int l, int r, int ql, int qr) { if(ql <= l && r <= qr) { return tree[v]; } def; if(qr <= mid) { return query(v + 1, l, mid, ql, qr); } else if(mid + 1 <= ql) { return query(rv, mid + 1, r, ql, qr); } return std::max(query(v + 1, l, mid, ql, qr), query(rv, mid + 1, r, ql, qr)); } int query(int l, int r) { assert(0 <= l && l <= r && r < n); return query(0, 0, n - 1, l, r); } }; constexpr int INF = 1E9; constexpr int maxN = int(3E5 + 5); int ans[maxN], last[maxN]; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int N, Q; std::cin >> N >> Q; std::string S; std::cin >> S; if(N <= 100 && Q <= 100) { std::vector<std::vector<int>> res(N, std::vector<int>(N)); for(int timer = 0; timer < Q; ++timer) { for(int i = 0; i < N; ++i) { bool ok = true; for(int j = i; j < N && ok; ++j) { ok &= S[j] == '1'; res[i][j] += ok; } } std::string T; std::cin >> T; if(T[0] == 't') { int i; std::cin >> i; --i; S[i] = (S[i] == '1' ? '0' : '1'); } else { int A, B; std::cin >> A >> B; --A, --B; std::cout << res[A][B - 1] << '\n'; } } return 0; } segtree seg(N); for(int i = 0; i < N; ++i) { if(S[i] == '1') { last[i] = 0; seg.modify(i, 0); } else { last[i] = INF; seg.modify(i, INF); } } for(int timer = 1; timer <= Q; ++timer) { std::string T; std::cin >> T; if(T[0] == 't') { int i; std::cin >> i; --i; if(S[i] == '1') { ans[i] += timer - last[i]; last[i] = INF; seg.modify(i, INF); S[i] = '0'; } else { last[i] = timer; seg.modify(i, timer); S[i] = '1'; } } else { int A, B; std::cin >> A >> B; --A, --B; int get = seg.query(A, B - 1); if(A + 1 == B) { get = ans[A]; debug(get); if(last[A] != INF) { debug(timer, last[A]); get += timer - last[A]; } std::cout << get << '\n'; } else if(get == INF) { std::cout << 0 << '\n'; } else { std::cout << timer - get << '\n'; } } #ifdef DEBUG for(int i = 0; i < N; ++i) { std::cerr << seg.query(i, i) << " \n"[i == N - 1]; } for(int i = 0; i < N; ++i) { std::cerr << ans[i] << " \n"[i == N - 1]; } for(int i = 0; i < N; ++i) { std::cerr << last[i] << " \n"[i == N - 1]; } debug(); #endif } return 0; }
#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...