제출 #551612

#제출 시각아이디문제언어결과실행 시간메모리
551612cig32가로등 (APIO19_street_lamps)C++17
20 / 100
875 ms8788 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; int ended[1001][1001], cnt[1001][1001], sum[1001][1001]; set<pair<pair<int, int>, int> > ranges; void insert_segment(int x, int y) { ranges.insert({{x, y}, t}); cnt[x][y]++; sum[x][y] += t; } void delete_segment(int x, int y) { auto it = ranges.lower_bound({{x, y}, 0}); ended[x][y] += t - sum[x][y]; cnt[x][y] = 0; sum[x][y] = 0; ranges.erase(it); } void solve(int tc) { t = 0; cin >> n >> q; for(int i=1; i<=n; i++) cin >> s[i]; 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; } } 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') { int l = i; for(pair<pair<int, int>, int> x: ranges) { if(x.first.second == i - 1) { int sto = x.first.first; l = sto; delete_segment(sto, i - 1); insert_segment(sto, i); break; } } if(l == i) { insert_segment(l, i); } for(pair<pair<int, int>, int> x: ranges) { if(x.first.first == i + 1) { int sto = x.first.second; delete_segment(l, i); delete_segment(i + 1, sto); insert_segment(l, sto); } } } else { for(pair<pair<int, int>, int> x: ranges) { if(x.first.first <= i && i <= x.first.second) { int ff = x.first.first, ss = x.first.second; delete_segment(ff, ss); if(ff < i) insert_segment(ff, i - 1); if(i < ss) insert_segment(i + 1, ss); break; } } } } else { int a, b; cin >> a >> b; b--; int ans = 0; for(int i=1; i<=a; i++) { for(int j=b; j<=100; j++) { ans += ended[i][j]; } } int tcnt = 0, tsum = 0; for(int i=1; i<=a; i++) { for(int j=b; j<=100; j++) { tcnt += cnt[i][j]; tsum += sum[i][j]; } } 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...