Submission #979149

# Submission time Handle Problem Language Result Execution time Memory
979149 2024-05-10T09:59:28 Z c2zi6 Street Lamps (APIO19_street_lamps) C++14
60 / 100
5000 ms 323168 KB
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define replr(i, a, b) for (int i = int(a); i <= int(b); ++i)
#define reprl(i, a, b) for (int i = int(a); i >= int(b); --i)
#define rep(i, n) for (int i = 0; i < int(n); ++i)
#define mkp(a, b) make_pair(a, b)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> PII;
typedef vector<int> VI;
typedef vector<PII> VPI;
typedef vector<VI> VVI;
typedef vector<VVI> VVVI;
typedef vector<VPI> VVPI;
typedef pair<ll, ll> PLL;
typedef vector<ll> VL;
typedef vector<PLL> VPL;
typedef vector<VL> VVL;
typedef vector<VVL> VVVL;
typedef vector<VPL> VVPL;
template<class T> T setmax(T& a, T b) {if (a < b) return a = b; return a;}
template<class T> T setmin(T& a, T b) {if (a < b) return a; return a = b;}
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template<class T>
using indset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

struct FENWICKTREE {
	VI a;
	VPI order;
	void init(int n) {
		a = VI(n);
		order.clear();
	}
	void add(int i, int s) {
		order.pb({i, s});
		while (i < a.size()) a[i] += s, i += i&-i;
	}
	int get(int i) {
		int ret = 0;
		while (i > 0) ret += a[i], i -= i&-i;
		return ret;
	}
	void clear() {
		while (order.size()) {
			auto[i, s] = order.back();
			order.pop_back();
			add(i, -s);
			order.pop_back();
		}
	}
} BIT;
struct POINT {
	int x, y, z, val, ind;
};
int n;
VI ret;
vector<POINT> v;
void CDQ(int l, int r) {
	if (l == r) return;
	int m = (l + r) / 2;
	CDQ(l, m), CDQ(m+1, r);
	vector<POINT> tmp;
	int i = l, j = m+1;
	while (i <= m && j <= r) {
		if (v[i].y <= v[j].y) BIT.add(v[i].z, v[i].val), tmp.pb(v[i++]);
		else ret[v[j].ind] += BIT.get(v[j].z-1), tmp.pb(v[j++]);
	}
	while (i <= m) BIT.add(v[i].z, v[i].val), tmp.pb(v[i++]);
	while (j <= r) ret[v[j].ind] += BIT.get(v[j].z-1), tmp.pb(v[j++]);
	replr(i, l, r) v[i] = tmp[i-l];
	BIT.clear();
}
void CDQ() {
	sort(all(v), [](POINT a, POINT b){
			return make_tuple(a.x, a.y, a.z) < make_tuple(b.x, b.y, b.z);
		});
	n = v.size();
	ret = VI(n+1);
	BIT.init(4e5);
	CDQ(0, n-1);
}
VI sol(vector<POINT> add, vector<POINT> get) {
	VI ans(get.size()+1);
	v.clear();
	rep(i, add.size()) v.pb(add[i]);
	rep(i, get.size()) v.pb(get[i]);
	CDQ();

	replr(i, 1, get.size()) ans[i] = ret[i] * get[i-1].z;
	rep(i, add.size()) add[i].val *= add[i].z;

	v.clear();
	rep(i, add.size()) v.pb(add[i]);
	rep(i, get.size()) v.pb(get[i]);
	CDQ();
	replr(i, 1, get.size()) ans[i] -= ret[i];
	return ans;
}

vector<POINT> avel;
vector<POINT> harc;
void add(int i, int j, int s, int t) {
	i++, j++;
	/* cout << i << " " << j << " " << s << " " << t << endl; */
	avel.pb({i, i, t, s, 0});
	avel.pb({i, j+1, t, -s, 0});
	avel.pb({j+1, i, t, -s, 0});
	avel.pb({j+1, j+1, t, s, 0});
}

void solve() {
	int n, q;
	cin >> n >> q;
	VI a(n);
	rep(i, n) {
		char ch;
		cin >> ch;
		a[i] = (ch == '1');
	}
	auto fn = [&](int i){
		for (int j = i; j < n; j++) if (a[j] == 0) return j;
		return n;
	};
	auto ln = [&](int i){
		for (int j = i; j >= 0; j--) if (a[j] == 0) return j;
		return -1;
	};
	set<PII> ranges;
	for (int i = 0; i < n; i++) if (a[i]) {
		int j = fn(i)-1;
		ranges.insert({i, j});
		add(i, j, +1, 1);
		i = j;
	}
			/* for (PII p : ranges) cout << p.ff+1 << "-" << p.ss+1 << " "; cout << endl; */
	rep(tm, q) {
		string t;
		cin >> t;
		if (t == "query") {
			int l, r;
			cin >> l >> r;
			harc.pb({l, r-1, tm+2, 0, (int)harc.size()+1});
		} else {
			int i;
			cin >> i;
			i--;
			if (a[i] == 0) {
				a[i] = 1;
				int L = i, R = i;
				if (i < n-1 && a[i+1]) {
					auto r = ranges.upper_bound({i, i});
					add(r->ff, r->ss, -1, tm+2);
					R = r->ss;
					ranges.erase(r);
				}
				if (i > 0 && a[i-1]) {
					auto l = prev(ranges.upper_bound({i, i}));
					add(l->ff, l->ss, -1, tm+2);
					L = l->ff;
					ranges.erase(l);
				}
				ranges.insert({L, R});
				add(L, R, +1, tm+2);
			} else if (a[i] == 1) {
				a[i] = 0;
				auto it = prev(ranges.upper_bound({i, 1e9}));
				add(it->ff, it->ss, -1, tm+2);
				int L = it->ff;
				int R = it->ss;
				ranges.erase(it);
				if (i < n-1 && a[i+1]) {
					ranges.insert({i+1, R});
					add(i+1, R, +1, tm+2);
				}
				if (i > 0 && a[i-1]) {
					ranges.insert({L, i-1});
					add(L, i-1, +1, tm+2);
				}
			}
			/* for (int x : a) cout << x; cout << endl; */
			/* for (PII p : ranges) cout << p.ff+1 << "-" << p.ss+1 << " "; cout << endl; */
		}
	}
	VI ans = sol(avel, harc);
	replr(i, 1, harc.size()) cout << ans[i] << " "; cout << endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    int t = 1;
    /* cin >> t; */
    while (t--) solve();
}

Compilation message

street_lamps.cpp: In member function 'void FENWICKTREE::add(int, int)':
street_lamps.cpp:42:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |   while (i < a.size()) a[i] += s, i += i&-i;
      |          ~~^~~~~~~~~~
street_lamps.cpp: In member function 'void FENWICKTREE::clear()':
street_lamps.cpp:51:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   51 |    auto[i, s] = order.back();
      |        ^
street_lamps.cpp: In function 'void solve()':
street_lamps.cpp:7:24: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
    7 | #define replr(i, a, b) for (int i = int(a); i <= int(b); ++i)
      |                        ^~~
street_lamps.cpp:191:2: note: in expansion of macro 'replr'
  191 |  replr(i, 1, harc.size()) cout << ans[i] << " "; cout << endl;
      |  ^~~~~
street_lamps.cpp:191:50: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  191 |  replr(i, 1, harc.size()) cout << ans[i] << " "; cout << endl;
      |                                                  ^~~~
street_lamps.cpp:130:7: warning: variable 'ln' set but not used [-Wunused-but-set-variable]
  130 |  auto ln = [&](int i){
      |       ^~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 3420 KB Output is correct
2 Correct 2 ms 3420 KB Output is correct
3 Correct 2 ms 3416 KB Output is correct
4 Correct 2 ms 3420 KB Output is correct
5 Correct 2 ms 3676 KB Output is correct
6 Correct 2 ms 3420 KB Output is correct
7 Correct 1 ms 3420 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2501 ms 173112 KB Output is correct
2 Correct 2508 ms 174012 KB Output is correct
3 Correct 2556 ms 171384 KB Output is correct
4 Correct 3248 ms 201272 KB Output is correct
5 Correct 3426 ms 205300 KB Output is correct
6 Correct 3671 ms 216900 KB Output is correct
7 Correct 610 ms 50952 KB Output is correct
8 Correct 631 ms 48512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 4240 KB Output is correct
2 Correct 12 ms 4228 KB Output is correct
3 Correct 9 ms 4156 KB Output is correct
4 Correct 3 ms 3672 KB Output is correct
5 Correct 4633 ms 307384 KB Output is correct
6 Correct 4522 ms 300368 KB Output is correct
7 Correct 3361 ms 204316 KB Output is correct
8 Correct 631 ms 50168 KB Output is correct
9 Correct 431 ms 32972 KB Output is correct
10 Correct 423 ms 43120 KB Output is correct
11 Correct 467 ms 42488 KB Output is correct
12 Correct 637 ms 52504 KB Output is correct
13 Correct 632 ms 49852 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 3928 KB Output is correct
2 Correct 7 ms 4084 KB Output is correct
3 Correct 11 ms 4132 KB Output is correct
4 Correct 15 ms 4336 KB Output is correct
5 Correct 1450 ms 94144 KB Output is correct
6 Correct 2575 ms 167924 KB Output is correct
7 Correct 3783 ms 216908 KB Output is correct
8 Execution timed out 5049 ms 323168 KB Time limit exceeded
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 3420 KB Output is correct
2 Correct 2 ms 3420 KB Output is correct
3 Correct 2 ms 3416 KB Output is correct
4 Correct 2 ms 3420 KB Output is correct
5 Correct 2 ms 3676 KB Output is correct
6 Correct 2 ms 3420 KB Output is correct
7 Correct 1 ms 3420 KB Output is correct
8 Correct 2501 ms 173112 KB Output is correct
9 Correct 2508 ms 174012 KB Output is correct
10 Correct 2556 ms 171384 KB Output is correct
11 Correct 3248 ms 201272 KB Output is correct
12 Correct 3426 ms 205300 KB Output is correct
13 Correct 3671 ms 216900 KB Output is correct
14 Correct 610 ms 50952 KB Output is correct
15 Correct 631 ms 48512 KB Output is correct
16 Correct 12 ms 4240 KB Output is correct
17 Correct 12 ms 4228 KB Output is correct
18 Correct 9 ms 4156 KB Output is correct
19 Correct 3 ms 3672 KB Output is correct
20 Correct 4633 ms 307384 KB Output is correct
21 Correct 4522 ms 300368 KB Output is correct
22 Correct 3361 ms 204316 KB Output is correct
23 Correct 631 ms 50168 KB Output is correct
24 Correct 431 ms 32972 KB Output is correct
25 Correct 423 ms 43120 KB Output is correct
26 Correct 467 ms 42488 KB Output is correct
27 Correct 637 ms 52504 KB Output is correct
28 Correct 632 ms 49852 KB Output is correct
29 Correct 5 ms 3928 KB Output is correct
30 Correct 7 ms 4084 KB Output is correct
31 Correct 11 ms 4132 KB Output is correct
32 Correct 15 ms 4336 KB Output is correct
33 Correct 1450 ms 94144 KB Output is correct
34 Correct 2575 ms 167924 KB Output is correct
35 Correct 3783 ms 216908 KB Output is correct
36 Execution timed out 5049 ms 323168 KB Time limit exceeded
37 Halted 0 ms 0 KB -