Submission #871148

# Submission time Handle Problem Language Result Execution time Memory
871148 2023-11-10T04:23:17 Z marvinthang Street Lamps (APIO19_street_lamps) C++17
100 / 100
598 ms 41620 KB
/*************************************
*    author: marvinthang             *
*    created: 10.11.2023 08:32:34    *
*************************************/

#include <bits/stdc++.h>

using namespace std;

#define                  fi  first
#define                  se  second
#define                left  ___left
#define               right  ___right
#define                TIME  (1.0 * clock() / CLOCKS_PER_SEC)
#define             MASK(i)  (1LL << (i))
#define           BIT(x, i)  ((x) >> (i) & 1)
#define  __builtin_popcount  __builtin_popcountll
#define              ALL(v)  (v).begin(), (v).end()
#define           REP(i, n)  for (int i = 0, _n = (n); i < _n; ++i)
#define          REPD(i, n)  for (int i = (n); i-- > 0; )
#define        FOR(i, a, b)  for (int i = (a), _b = (b); i < _b; ++i) 
#define       FORD(i, b, a)  for (int i = (b), _a = (a); --i >= _a; ) 
#define       FORE(i, a, b)  for (int i = (a), _b = (b); i <= _b; ++i) 
#define      FORDE(i, b, a)  for (int i = (b), _a = (a); i >= _a; --i) 
#define        scan_op(...)  istream & operator >> (istream &in, __VA_ARGS__ &u)
#define       print_op(...)  ostream & operator << (ostream &out, const __VA_ARGS__ &u)
#ifdef LOCAL
    #include "debug.h"
#else
    #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
    #define DB(...) 23
    #define db(...) 23
    #define debug(...) 23
#endif

template <class U, class V> scan_op(pair <U, V>)  { return in >> u.first >> u.second; }
template <class T> scan_op(vector <T>)  { for (size_t i = 0; i < u.size(); ++i) in >> u[i]; return in; }
template <class U, class V> print_op(pair <U, V>)  { return out << '(' << u.first << ", " << u.second << ')'; }
template <size_t i, class T> ostream & print_tuple_utils(ostream &out, const T &tup) { if constexpr(i == tuple_size<T>::value) return out << ")";  else return print_tuple_utils<i + 1, T>(out << (i ? ", " : "(") << get<i>(tup), tup); }
template <class ...U> print_op(tuple<U...>) { return print_tuple_utils<0, tuple<U...>>(out, u); }
template <class Con, class = decltype(begin(declval<Con>()))> typename enable_if <!is_same<Con, string>::value, ostream&>::type operator << (ostream &out, const Con &con) { out << '{'; for (__typeof(con.begin()) it = con.begin(); it != con.end(); ++it) out << (it == con.begin() ? "" : ", ") << *it; return out << '}'; }

// index from 0
template <class T> struct Fenwick {
    int n; vector <T> bit;
    Fenwick(int _n = 0): n(_n), bit(n + 1, 0) {}
    void reset(void) { fill(bit.begin(), bit.end(), 0); }
    void resize(int _n) { bit.assign(_n + 1, 0); }
    void update(int i, T val) { for (++i; i <= n; i += i & -i) bit[i] += val; }
    T get(int i) {
        if (i < 0) return 0;
        T res(0);
        for (i = min(i + 1, n); i > 0; i &= i - 1) res += bit[i];
        return res;
    }
    int upper_bound(T val) {
        int res = 0;
        for (int i = __lg(n); i >= 0; --i) 
            if ((res | MASK(i)) <= n && val >= bit[res | MASK(i)]) res |= MASK(i), val -= bit[res];
        return res;
    }
    int lower_bound(T val) {
        int res = 0;
        for (int i = __lg(n); i >= 0; --i)
            if ((res | MASK(i)) <= n && val > bit[res | MASK(i)]) res |= MASK(i), val -= bit[res];
        return res;
    }
};

// end of template

void process(void) {
	int n, q; string s; cin >> n >> q >> s;
	map <int, int> mp;
	vector <array<int, 3>> queries(q);
	REP(i, q) {
		string s; cin >> s >> queries[i][1];
		queries[i][0] = s[0] == 'q';
		--queries[i][1];
		if (queries[i][0]) {
			cin >> queries[i][2];
			queries[i][2] -= 2;
		}
	}
	Fenwick <int> bit_sum(n);
	Fenwick <int> bit_cnt(n);
	vector <int> sum(q);
	vector <bool> exist(q);
	function <vector <array <int, 3>>(int, int, const vector <int> &)> solve = [&] (int l, int r, const vector <int> &ask) {
		if (r - l == 1) {
			vector <array <int, 3>> events;
			auto addEvent = [&] (int x, int y, int v) {
				events.insert(lower_bound(ALL(events), array{x, y, v}), array{x, y, v});
			};
			if (!l) {
				REP(i, n) if (s[i] == '1') {
					int j = i;
					while (j < n && s[i] == s[j]) ++j;
					mp[i] = j;
					events.push_back(array{i, j, 1});
					if (queries[l][0] && i <= queries[l][1] && queries[l][2] < j) sum[l] = 1;
					i = j;
				}
				REP(i, n) if (s[i] == '1') bit_cnt.update(i, +1);
			}
			if (!queries[l][0]) {
				int u = queries[l][1];
				if (s[u] == '0') {
					auto it = mp.lower_bound(u);
					int r = u + 1;
					if (u + 1 < n && s[u + 1] == '1') {
						r = it->se;
						addEvent(u + 1, r, l);
						it = mp.erase(it);
					}
					if (u && s[u - 1] == '1') {
						it = prev(it);
						addEvent(it->fi, it->se, l);
						it->se = r;
						addEvent(it->fi, it->se, -l);
					} else {
						mp[u] = r;
						addEvent(u, r, -l);
					}
					s[u] = '1';
					bit_cnt.update(u, +1);
				} else {
					auto it = prev(mp.upper_bound(u));
					addEvent(it->fi, it->se, l);
					if (u + 1 < it->se) {
						mp[u + 1] = it->se;
						addEvent(u + 1, it->se, -l);
					}
					if (it->fi < u) {
						it->se = u;
						addEvent(it->fi, u, -l);
					} else mp.erase(it);
					s[u] = '0';
					bit_cnt.update(u, -1);
				}
			} else {
				int x = queries[l][1], y = queries[l][2];
				exist[l] = bit_cnt.get(y) - bit_cnt.get(x - 1) == y - x + 1;
			}
			return events;
		}
		int m = l + r >> 1;
		vector <int> ask_left, ask_right;
		for (int i: ask) (i < m ? ask_left : ask_right).push_back(i);
		auto left = solve(l, m, ask_left);
		int j = 0;
		for (int i: ask_right) {
			while (j < left.size() && left[j][0] <= queries[i][1]) {
				bit_sum.update(left[j][0], left[j][2]);
				bit_sum.update(left[j][1], -left[j][2]);
				++j;
			}
			sum[i] += bit_sum.get(queries[i][2]);
		}
		while (j--) {
			bit_sum.update(left[j][0], -left[j][2]);
			bit_sum.update(left[j][1], left[j][2]);
		}

		auto right = solve(m, r, ask_right);
		vector <array <int, 3>> events;
		merge(ALL(left), ALL(right), back_inserter(events));
		return events;
	};
	vector <int> ask;
	REP(i, q) if (queries[i][0]) ask.push_back(i);
	sort(ALL(ask), [&] (int a, int b) { return queries[a][1] < queries[b][1]; });
	solve(0, q, ask);
	REP(i, q) if (queries[i][0]) cout << exist[i] * i + sum[i] << '\n';
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(nullptr); // cout.tie(nullptr);
	file("street_lamps");
	// int t; cin >> t; while (t--)
	process();
	// cerr << "Time elapsed: " << TIME << " s.\n";
	return (0^0);
}

Compilation message

street_lamps.cpp: In lambda function:
street_lamps.cpp:147:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  147 |   int m = l + r >> 1;
      |           ~~^~~
street_lamps.cpp:153:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  153 |    while (j < left.size() && left[j][0] <= queries[i][1]) {
      |           ~~^~~~~~~~~~~~~
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:30:61: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |     #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
street_lamps.cpp:179:2: note: in expansion of macro 'file'
  179 |  file("street_lamps");
      |  ^~~~
street_lamps.cpp:30:94: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |     #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                                                       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
street_lamps.cpp:179:2: note: in expansion of macro 'file'
  179 |  file("street_lamps");
      |  ^~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 456 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 291 ms 20924 KB Output is correct
2 Correct 335 ms 22028 KB Output is correct
3 Correct 350 ms 21232 KB Output is correct
4 Correct 595 ms 29748 KB Output is correct
5 Correct 594 ms 28480 KB Output is correct
6 Correct 322 ms 30284 KB Output is correct
7 Correct 223 ms 12328 KB Output is correct
8 Correct 264 ms 14704 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 487 ms 36568 KB Output is correct
6 Correct 598 ms 41620 KB Output is correct
7 Correct 547 ms 29012 KB Output is correct
8 Correct 244 ms 12300 KB Output is correct
9 Correct 108 ms 8300 KB Output is correct
10 Correct 118 ms 8388 KB Output is correct
11 Correct 124 ms 9928 KB Output is correct
12 Correct 224 ms 12308 KB Output is correct
13 Correct 225 ms 12048 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 604 KB Output is correct
5 Correct 278 ms 19196 KB Output is correct
6 Correct 299 ms 23096 KB Output is correct
7 Correct 312 ms 30112 KB Output is correct
8 Correct 335 ms 32444 KB Output is correct
9 Correct 213 ms 27444 KB Output is correct
10 Correct 210 ms 27016 KB Output is correct
11 Correct 209 ms 24960 KB Output is correct
12 Correct 214 ms 26728 KB Output is correct
13 Correct 208 ms 24772 KB Output is correct
14 Correct 211 ms 28080 KB Output is correct
15 Correct 224 ms 12028 KB Output is correct
16 Correct 225 ms 12720 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 456 KB Output is correct
8 Correct 291 ms 20924 KB Output is correct
9 Correct 335 ms 22028 KB Output is correct
10 Correct 350 ms 21232 KB Output is correct
11 Correct 595 ms 29748 KB Output is correct
12 Correct 594 ms 28480 KB Output is correct
13 Correct 322 ms 30284 KB Output is correct
14 Correct 223 ms 12328 KB Output is correct
15 Correct 264 ms 14704 KB Output is correct
16 Correct 1 ms 348 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 1 ms 348 KB Output is correct
19 Correct 1 ms 348 KB Output is correct
20 Correct 487 ms 36568 KB Output is correct
21 Correct 598 ms 41620 KB Output is correct
22 Correct 547 ms 29012 KB Output is correct
23 Correct 244 ms 12300 KB Output is correct
24 Correct 108 ms 8300 KB Output is correct
25 Correct 118 ms 8388 KB Output is correct
26 Correct 124 ms 9928 KB Output is correct
27 Correct 224 ms 12308 KB Output is correct
28 Correct 225 ms 12048 KB Output is correct
29 Correct 1 ms 348 KB Output is correct
30 Correct 1 ms 348 KB Output is correct
31 Correct 1 ms 348 KB Output is correct
32 Correct 1 ms 604 KB Output is correct
33 Correct 278 ms 19196 KB Output is correct
34 Correct 299 ms 23096 KB Output is correct
35 Correct 312 ms 30112 KB Output is correct
36 Correct 335 ms 32444 KB Output is correct
37 Correct 213 ms 27444 KB Output is correct
38 Correct 210 ms 27016 KB Output is correct
39 Correct 209 ms 24960 KB Output is correct
40 Correct 214 ms 26728 KB Output is correct
41 Correct 208 ms 24772 KB Output is correct
42 Correct 211 ms 28080 KB Output is correct
43 Correct 224 ms 12028 KB Output is correct
44 Correct 225 ms 12720 KB Output is correct
45 Correct 143 ms 11248 KB Output is correct
46 Correct 173 ms 11340 KB Output is correct
47 Correct 293 ms 15312 KB Output is correct
48 Correct 528 ms 30124 KB Output is correct
49 Correct 137 ms 9924 KB Output is correct
50 Correct 140 ms 10616 KB Output is correct
51 Correct 140 ms 9152 KB Output is correct
52 Correct 141 ms 10436 KB Output is correct
53 Correct 142 ms 10500 KB Output is correct
54 Correct 143 ms 10536 KB Output is correct