제출 #551702

#제출 시각아이디문제언어결과실행 시간메모리
551702cig32가로등 (APIO19_street_lamps)C++17
20 / 100
5020 ms524288 KiB
#include "bits/stdc++.h" #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/detail/standard_policies.hpp> using namespace std; #define int long long const int MAXN = 3e5 + 10; const int MOD = 998244353; #define ll __int128 using namespace __gnu_pbds; 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; set<pair<pair<int, int>, int> > ranges; typedef tree<pair<pair<int,int>, int>, null_type, less<pair<pair<int,int>, int> >, rb_tree_tag, tree_order_statistics_node_update> ernie_tree; struct multibit { // O(N log^2 N) ernie_tree ost[MAXN]; map<pair<int,int>,queue<int> >mp; int id = 0; void add(int x, int y, int cnt) { // O(cnt * log^2 N) if(cnt < 0) { erase(x, y, -cnt); return; } int stox = x; for(int i=0; i<cnt; i++) { x = stox; id++; mp[{x, y}].push(id); for(;x<MAXN;x+=x&-x) { ost[x].insert({{y, x}, id}); } } } void erase(int x, int y, int cnt) { // O(cnt * log^2 N) if(cnt < 0) { add(x, y, -cnt); return; } int stox = x; for(int i=0; i<cnt; i++) { x = stox; if(mp[{x, y}].empty()) return; int ono = mp[{x, y}].front(); mp[{x, y}].pop(); for(;x<MAXN;x+=x&-x) { ost[x].erase({{y, x}, ono}); } } } int sum(int x, int y) { int s = 0; for(;x;x-=x&-x) { s += ost[x].order_of_key({{y, 1e7}, 1e7}); } return s; } }; multibit cnt, ended; int sum[1226][1029]; int jkjkjk = 0; void insert_segment(int x, int y) { ranges.insert({{x, y}, t}); cnt.add(x, y, 1); sum[x][y] += t; } void delete_segment(int x, int y) { auto it = ranges.lower_bound({{x, y}, 0}); jkjkjk += t - sum[x][y]; ended.add(x, y, t - sum[x][y]); cnt.erase(x, y, 1); 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; ans += ended.sum(a, 300000) - ended.sum(a, b - 1); int tcnt = 0, tsum = 0; tcnt = cnt.sum(a, 300000) - cnt.sum(a, b - 1); for(int i=1; i<=a; i++) { for(int j=b; j<=100; j++) { tsum += sum[i][j]; } } if(tcnt == 0) { cout << ans << '\n'; continue; } ans += t * tcnt - tsum; cout << ans << '\n'; } assert(jkjkjk < 1e8); } } 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...