Submission #874151

#TimeUsernameProblemLanguageResultExecution timeMemory
874151abczzStreet Lamps (APIO19_street_lamps)C++14
100 / 100
854 ms135112 KiB
#include <iostream> #include <map> #include <vector> #include <array> #include <algorithm> #define ll long long using namespace std; vector <ll> V; vector <array<ll, 4>> Q; map <ll, array<ll, 2> > mp; array <ll, 2> bit[300001]; vector <ll> U; ll n, q, a, b, t, F[300001]; void update(ll x, array<ll, 2> y) { while (x <= n) { U.push_back(x); bit[x] = {bit[x][0]+y[0], bit[x][1]+y[1]}; x += x&-x; } } array<ll, 2> query(ll x) { array<ll, 2> ret = {0, 0}; while (x) { ret = {ret[0]+bit[x][0], ret[1]+bit[x][1]}; x -= x&-x; } return ret; } bool ok; string S, T; void cdq(ll l, ll r) { if (l == r) return; vector <array<ll, 4> > tmp; ll mid = (l+r)/2, i = l, j = mid+1; cdq(l, mid); cdq(mid+1, r); while (i <= mid && j <= r) { if (Q[i][1] <= Q[j][1]) { tmp.push_back(Q[i]); if (!Q[i][0]) { ++i; continue; } if (Q[i][0] == 1) update(n-Q[i][2], {1, -Q[i][3]}); else update(n-Q[i][2], {-1, Q[i][3]}); ++i; } else { tmp.push_back(Q[j]); if (Q[j][0]) { ++j; continue; } auto [x, y] = query(n-Q[j][2]); F[Q[j][3]] += y + x * Q[j][3]; ++j; } } while (i <= mid) { tmp.push_back(Q[i]); ++i; } while (j <= r) { tmp.push_back(Q[j]); if (Q[j][0]) { ++j; continue; } auto [x, y] = query(n-Q[j][2]); F[Q[j][3]] += y + x * Q[j][3]; ++j; } for (auto x : U) bit[x] = {0, 0}; U.clear(); j = 0; for (i=l; i<=r; ++i) { swap(Q[i], tmp[j++]); } } int main() { cin >> n >> q >> S; V.push_back(0); for (int i=0; i+1<S.length(); ++i) { if (S[i] != S[i+1]) V.push_back(i+1); } for (int i=0; i<V.size(); ++i) { if (S[V[i]] == '0') continue; if (i == V.size()-1) mp[V[i]] = {n-1, 0}; else mp[V[i]] = {V[i+1]-1, 0}; } while (q--) { ++t; F[t] = -1; cin >> T >> a; if (T == "toggle") { --a; ok = 0; if (S[a] == '0') { S[a] = '1'; auto it = mp.lower_bound(a); if (it != mp.begin()) { auto pv = prev(it); if (pv->second[0] == a-1 && it != mp.end() && a+1 == it->first) { Q.push_back({1, pv->first, pv->second[0], pv->second[1]}); Q.push_back({2, pv->first, pv->second[0], t}); Q.push_back({1, it->first, it->second[0], it->second[1]}); Q.push_back({2, it->first, it->second[0], t}); auto r = it->second[0]; mp.erase(it); mp[pv->first] = {r, t}; ok = 1; } else if (pv->second[0] == a-1) { Q.push_back({1, pv->first, pv->second[0], pv->second[1]}); Q.push_back({2, pv->first, pv->second[0], t}); mp[pv->first] = {a, t}; ok = 1; } } if (ok) continue; if (it != mp.end() && a+1 == it->first) { Q.push_back({1, it->first, it->second[0], it->second[1]}); Q.push_back({2, it->first, it->second[0], t}); auto r = it->second[0]; mp.erase(it); mp[a] = {r, t}; } else mp[a] = {a, t}; } else { S[a] = '0'; auto it = prev(mp.lower_bound(a+1)); Q.push_back({1, it->first, it->second[0], it->second[1]}); Q.push_back({2, it->first, it->second[0], t}); if (it->first == a && it->second[0] == a) mp.erase(it); else if (it->first == a) { auto r = it->second[0]; mp.erase(it); mp[a+1] = {r, t}; } else if (it->second[0] == a) mp[it->first] = {a-1, t}; else { auto r = it->second[0]; mp[it->first] = {a-1, t}; mp[a+1] = {r, t}; } } } else { F[t] = 0; cin >> b; --a, b -= 2; Q.push_back({0, a, b, t}); } } for (auto [x, y] : mp) { Q.push_back({1, x, y[0], y[1]}); } sort(Q.begin(), Q.end(), [](auto a, auto b) { return a[3] < b[3] || (a[3] == b[3] && a[0] > b[0]); }); cdq(0, Q.size()-1); for (int i=1; i<=t; ++i) { if (F[i] >= 0) cout << F[i] << '\n'; } }

Compilation message (stderr)

street_lamps.cpp: In function 'void cdq(long long int, long long int)':
street_lamps.cpp:60:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   60 |       auto [x, y] = query(n-Q[j][2]);
      |            ^
street_lamps.cpp:75:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   75 |     auto [x, y] = query(n-Q[j][2]);
      |          ^
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:90:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |   for (int i=0; i+1<S.length(); ++i) {
      |                 ~~~^~~~~~~~~~~
street_lamps.cpp:93:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |   for (int i=0; i<V.size(); ++i) {
      |                 ~^~~~~~~~~
street_lamps.cpp:95:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     if (i == V.size()-1) mp[V[i]] = {n-1, 0};
      |         ~~^~~~~~~~~~~~~
street_lamps.cpp:163:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  163 |   for (auto [x, y] : mp) {
      |             ^
#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...