Submission #551813

#TimeUsernameProblemLanguageResultExecution timeMemory
551813cig32Street Lamps (APIO19_street_lamps)C++17
20 / 100
5057 ms524288 KiB
#include "bits/stdc++.h" using namespace std; #define int long long const int MAXN = 3e5 + 10; const int MOD = 998244353; #define ll __int128 mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count()); int rnd(int x, int y) { int u = uniform_int_distribution<int>(x, y)(rng); return u; } ll read() { int x; cin >> x; return (ll)x; } long long bm(long long b, long long p) { if(p==0) return 1 % MOD; long long r = bm(b, p >> 1); if(p&1) return (((r*r) % MOD) * b) % MOD; return (r*r) % MOD; } long long inv(long long b) { return bm(b, MOD-2); } long long f[MAXN]; long long nCr(int n, int r) { long long ans = f[n]; ans *= inv(f[r]); ans %= MOD; ans *= inv(f[n-r]); ans %= MOD; return ans; } void precomp() { for(int i=0; i<MAXN; i++) f[i] = (i == 0 ? 1 % MOD : (f[i-1] * i) % MOD); } int fastlog(int x) { return (x == 0 ? -1 : 32 - __builtin_clz(x) - 1); } void gay(int i) { cout << "Case #" << i << ": "; } char s[MAXN]; int n, q, t; struct ernie_tree { vector<unordered_map<int, int> > vt; int stok; void add(int x, int y, int k) { for(int i = x; i < stok; i += i & -i) { for(int j = y; j < stok; j += j & -j) { vt[i][j] += k; } } } int sum(int x, int y) { int ans = 0; for(int i = x; i > 0; i -= i & -i) { for(int j = y; j > 0; j -= j & -j) { ans += vt[i][j]; } } return ans; } void resize(int k) { k += 6; stok = k; vt.resize(k); } }; ernie_tree ended, cnt, sum; int l[MAXN], r[MAXN]; set<pair<int, int> > all_segments; void insert_segment(int x, int y) { l[y] = x; r[x] = y; all_segments.insert({y, x}); cnt.add(x, y, 1); sum.add(x, y, t); } void delete_segment(int x, int y) { all_segments.erase({y, x}); ended.add(x, y, t - (sum.sum(x, y) - sum.sum(x, y - 1) - sum.sum(x - 1, y) + sum.sum(x - 1, y - 1))); int curcnt = cnt.sum(x, y) - cnt.sum(x, y - 1) - cnt.sum(x - 1, y) + cnt.sum(x - 1, y - 1); cnt.add(x, y, -curcnt); int cursum = sum.sum(x, y) - sum.sum(x, y - 1) - sum.sum(x - 1, y) + sum.sum(x - 1, y - 1); sum.add(x, y, -cursum); r[x] = l[y] = -1; } void solve(int tc) { t = 0; cin >> n >> q; ended.resize(300000); cnt.resize(300000); sum.resize(300000); for(int i=1; i<=n; i++) cin >> s[i]; for(int i=0; i<=n+1; i++) l[i] = r[i] = -1; for(int i=1; i<=n; i++) { if(s[i] == '1') { int j = i; while(j + 1 <= n && s[j+1] == '1') ++j; insert_segment(i, j); i = j + 1; } } all_segments.insert({1e7, 1e7}); while(q--) { ++t; string str; cin >> str; if(str == "toggle") { int i; cin >> i; s[i] = (s[i] == '1' ? '0' : '1'); if(s[i] == '1') { if(l[i-1] != -1) { int sto = l[i-1]; delete_segment(sto, i-1); insert_segment(sto, i); } else { insert_segment(i, i); } if(r[i+1] != -1) { int sto = r[i+1]; int sto2 = l[i]; delete_segment(l[i], i); delete_segment(i+1, sto); insert_segment(sto2, sto); } } else { auto it = all_segments.lower_bound({i, 0}); pair<int, int> seg = *it; if(seg.first != 1e7 && seg.second <= i && i <= seg.first) { int ff = seg.second, ss = seg.first; delete_segment(ff, ss); if(ff < i) insert_segment(ff, i - 1); if(i < ss) insert_segment(i + 1, ss); } } } else { int a, b; cin >> a >> b; b--; int ans = ended.sum(a, 300000) - ended.sum(a, b - 1); int tcnt = cnt.sum(a, 300000) - cnt.sum(a, b - 1); int tsum = sum.sum(a, 300000) - sum.sum(a, b - 1); if(tcnt == 0) { cout << ans << '\n'; continue; } ans += t * tcnt - tsum; cout << ans << '\n'; } } } int32_t main() { precomp(); //ios::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; for(int i=1; i<=t; i++) solve(i); } // I don't know geometry.
#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...