답안 #501669

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
501669 2022-01-04T09:39:42 Z desmond_willow Sterilizing Spray (JOI15_sterilizing) C++17
0 / 100
5000 ms 3292 KB
#include<bits/stdc++.h>

using namespace std;

int n, q, k;

void build (int l, int r, int* segtree, int pos) {
	if (l == r) {
		#ifdef DEBUG
		//just to verify that input order is correct
		printf ("Taking input for index %d\n", l);
		#endif
		cin >> segtree[pos];
		return;
	}
	int mid = (l + r)/2;
	build (l, mid, segtree, pos * 2);
	build (mid + 1, r, segtree, pos * 2 + 1);
	segtree[pos] = segtree[pos * 2] + segtree[pos * 2 + 1];
}

int query (int l, int r, int target_l, int target_r, int* segtree, int pos) {
	// no intersection
	if (r < target_l || l > target_r) {
		return 0;
	} if (target_l <= l && r <= target_r) { //total intersection
		#ifdef DEBUG
		printf ("Total intersection querying range (%d, %d): %d\n", l, r, segtree[pos]);
		#endif
		return segtree[pos];
	} else { //partial intersection
		int mid = (l + r)/2;
		return query(l, mid, target_l, target_r, segtree, pos*2) + 
			query(mid + 1, r, target_l, target_r, segtree, pos*2 + 1);
	}
}

void spray (int l, int r, int target_l, int target_r, int* segtree, int pos) {
	// no intersection
	if (r < target_l || l > target_r) {return;}

	if (l == r) {
		#ifdef DEBUG
		printf ("Sprayed %dth dish: was %d, now is %d\n", l, segtree[pos], segtree[pos] / k);
		#endif

		segtree[pos] /= k;
		return;
	}
	int mid = (l + r)/2;
	spray (l, mid, target_l, target_r, segtree, pos * 2);
	spray (mid + 1, r, target_l, target_r, segtree, pos * 2 + 1);
	#ifdef DEBUG
	printf ("Updating range (%d, %d) to %d (from %d)\n", l, r, segtree[pos * 2] + segtree[pos * 2 + 1], segtree[pos]);
	#endif
	segtree[pos] = segtree[pos * 2] + segtree[pos * 2 + 1];
}

void update (int l, int r, int* segtree, int pos, int index, int value) {
	// no intersection
	if (r < index || l > index) {return;}

	if (l == r && l == index) {
		segtree[pos] = value;
		return;
	}
	int mid = (l + r)/2;
	update (l, mid, segtree, pos * 2, index, value);
	update (mid + 1, r, segtree, pos * 2 + 1, index, value);
	segtree[pos] = segtree[pos * 2] + segtree[pos * 2 + 1];
}

// we can't use a range-update range-query segtree as is because
// integer division is not distributive
// i.e. 2//3 + 1//3 != 3//3
// thus we can't apply division to sum of dishes directly
// we'll have to update all dishes individually
int main () {
	cin >> n >> q >> k;
	int segtree[4*n + 1];
	build (1, n, segtree, 1);

	for (int i = 0; i < q; i++) {
		int op_type; cin >> op_type;
		if (op_type == 1) {
			int ind, val; cin >> ind >> val;
			#ifdef DEBUG
			printf ("Setting %d dish to %d\n", ind, val);
			#endif
			update (1, n, segtree, 1, ind, val);
		} else if (op_type == 2) {
			int l, r; cin >> l >> r;
			#ifdef DEBUG
			printf ("Spraying %d to %d dishes\n", l, r);
			#endif
			spray (1, n, l, r, segtree, 1);
		} else if (op_type == 3) {
			int l, r; cin >> l >> r;
			#ifdef DEBUG
			printf ("Querying amount in %d to %d dishes\n", l, r);
			#endif
			cout << query(1, n, l, r, segtree, 1) << endl;
		}
	}
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 332 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4930 ms 3292 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 295 ms 876 KB Output is correct
2 Correct 562 ms 1264 KB Output is correct
3 Correct 933 ms 1384 KB Output is correct
4 Correct 1992 ms 1920 KB Output is correct
5 Execution timed out 5093 ms 2984 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3016 ms 2860 KB Output isn't correct
2 Halted 0 ms 0 KB -