Submission #959644

# Submission time Handle Problem Language Result Execution time Memory
959644 2024-04-08T14:56:02 Z vjudge1 Wall (IOI14_wall) C++17
61 / 100
639 ms 262144 KB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MAXN = 2e6;  // 1-based

int N;
ll A[MAXN*4];

struct Node {
	ll sum;   // Sum tag
	ll max1;  // Max value
	ll max2;  // Second Max value
	ll maxc;  // Max value count
	ll min1;  // Min value
	ll min2;  // Second Min value
	ll minc;  // Min value count
	ll lazy;  // Lazy tag
} T[MAXN * 4];

void merge(int t) {
	// sum
	T[t].sum = T[t << 1].sum + T[t << 1 | 1].sum;

	// max
	if (T[t << 1].max1 == T[t << 1 | 1].max1) {
		T[t].max1 = T[t << 1].max1;
		T[t].max2 = max(T[t << 1].max2, T[t << 1 | 1].max2);
		T[t].maxc = T[t << 1].maxc + T[t << 1 | 1].maxc;
	} else {
		if (T[t << 1].max1 > T[t << 1 | 1].max1) {
			T[t].max1 = T[t << 1].max1;
			T[t].max2 = max(T[t << 1].max2, T[t << 1 | 1].max1);
			T[t].maxc = T[t << 1].maxc;
		} else {
			T[t].max1 = T[t << 1 | 1].max1;
			T[t].max2 = max(T[t << 1].max1, T[t << 1 | 1].max2);
			T[t].maxc = T[t << 1 | 1].maxc;
		}
	}

	// min
	if (T[t << 1].min1 == T[t << 1 | 1].min1) {
		T[t].min1 = T[t << 1].min1;
		T[t].min2 = min(T[t << 1].min2, T[t << 1 | 1].min2);
		T[t].minc = T[t << 1].minc + T[t << 1 | 1].minc;
	} else {
		if (T[t << 1].min1 < T[t << 1 | 1].min1) {
			T[t].min1 = T[t << 1].min1;
			T[t].min2 = min(T[t << 1].min2, T[t << 1 | 1].min1);
			T[t].minc = T[t << 1].minc;
		} else {
			T[t].min1 = T[t << 1 | 1].min1;
			T[t].min2 = min(T[t << 1].min1, T[t << 1 | 1].min2);
			T[t].minc = T[t << 1 | 1].minc;
		}
	}
}

void push_add(int t, int tl, int tr, ll v) {
	if (v == 0) { return; }
	T[t].sum += (tr - tl + 1) * v;
	T[t].max1 += v;
	if (T[t].max2 != -LLONG_MAX) { T[t].max2 += v; }
	T[t].min1 += v;
	if (T[t].min2 != LLONG_MAX) { T[t].min2 += v; }
	T[t].lazy += v;
}

// corresponds to a chmin update
void push_max(int t, ll v, bool l) {
	if (v >= T[t].max1) { return; }
	T[t].sum -= T[t].max1 * T[t].maxc;
	T[t].max1 = v;
	T[t].sum += T[t].max1 * T[t].maxc;
	if (l) {
		T[t].min1 = T[t].max1;
	} else {
		if (v <= T[t].min1) {
			T[t].min1 = v;
		} else if (v < T[t].min2) {
			T[t].min2 = v;
		}
	}
}

// corresponds to a chmax update
void push_min(int t, ll v, bool l) {
	if (v <= T[t].min1) { return; }
	T[t].sum -= T[t].min1 * T[t].minc;
	T[t].min1 = v;
	T[t].sum += T[t].min1 * T[t].minc;
	if (l) {
		T[t].max1 = T[t].min1;
	} else {
		if (v >= T[t].max1) {
			T[t].max1 = v;
		} else if (v > T[t].max2) {
			T[t].max2 = v;
		}
	}
}

void pushdown(int t, int tl, int tr) {
	if (tl == tr) return;
	// sum
	int tm = (tl + tr) >> 1;
	push_add(t << 1, tl, tm, T[t].lazy);
	push_add(t << 1 | 1, tm + 1, tr, T[t].lazy);
	T[t].lazy = 0;

	// max
	push_max(t << 1, T[t].max1, tl == tm);
	push_max(t << 1 | 1, T[t].max1, tm + 1 == tr);

	// min
	push_min(t << 1, T[t].min1, tl == tm);
	push_min(t << 1 | 1, T[t].min1, tm + 1 == tr);
}

void build(int t = 1, int tl = 0, int tr = N - 1) {
	T[t].lazy = 0;
	if (tl == tr) {
		T[t].sum = T[t].max1 = T[t].min1 = A[tl];
		T[t].maxc = T[t].minc = 1;
		T[t].max2 = -LLONG_MAX;
		T[t].min2 = LLONG_MAX;
		return;
	}

	int tm = (tl + tr) >> 1;
	build(t << 1, tl, tm);
	build(t << 1 | 1, tm + 1, tr);
	merge(t);
}

void update_add(int l, int r, ll v, int t = 1, int tl = 0, int tr = N - 1) {
	if (r < tl || tr < l) { return; }
	if (l <= tl && tr <= r) {
		push_add(t, tl, tr, v);
		return;
	}
	pushdown(t, tl, tr);

	int tm = (tl + tr) >> 1;
	update_add(l, r, v, t << 1, tl, tm);
	update_add(l, r, v, t << 1 | 1, tm + 1, tr);
	merge(t);
}

void update_chmin(int l, int r, ll v, int t = 1, int tl = 0, int tr = N - 1) {
	if (r < tl || tr < l || v >= T[t].max1) { return; }
	if (l <= tl && tr <= r && v > T[t].max2) {
		push_max(t, v, tl == tr);
		return;
	}
	pushdown(t, tl, tr);

	int tm = (tl + tr) >> 1;
	update_chmin(l, r, v, t << 1, tl, tm);
	update_chmin(l, r, v, t << 1 | 1, tm + 1, tr);
	merge(t);
}

void update_chmax(int l, int r, ll v, int t = 1, int tl = 0, int tr = N - 1) {
	if (r < tl || tr < l || v <= T[t].min1) { return; }
	if (l <= tl && tr <= r && v < T[t].min2) {
		push_min(t, v, tl == tr);
		return;
	}
	pushdown(t, tl, tr);

	int tm = (tl + tr) >> 1;
	update_chmax(l, r, v, t << 1, tl, tm);
	update_chmax(l, r, v, t << 1 | 1, tm + 1, tr);
	merge(t);
}

ll query_sum(int l, int r, int t = 1, int tl = 0, int tr = N - 1) {
	if (r < tl || tr < l) { return 0; }
	if (l <= tl && tr <= r) { return T[t].sum; }
	pushdown(t, tl, tr);

	int tm = (tl + tr) >> 1;
	return query_sum(l, r, t << 1, tl, tm) +
	       query_sum(l, r, t << 1 | 1, tm + 1, tr);
}

void buildWall(int NN, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
  N = NN;

  build();
  for (int i = 0; i < k; i++) {
    if (op[i] == 1) update_chmax(left[i], right[i], height[i]);
    else update_chmin(left[i], right[i], height[i]);
  }

  for (int i = 0; i < N; i++) {
    finalHeight[i] = query_sum(i, i);
  }
}

# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 2 ms 348 KB Output is correct
3 Correct 2 ms 348 KB Output is correct
4 Correct 8 ms 2788 KB Output is correct
5 Correct 7 ms 2652 KB Output is correct
6 Correct 7 ms 3060 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 114 ms 8680 KB Output is correct
3 Correct 60 ms 8060 KB Output is correct
4 Correct 195 ms 25488 KB Output is correct
5 Correct 175 ms 25940 KB Output is correct
6 Correct 219 ms 25732 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 3 ms 348 KB Output is correct
4 Correct 8 ms 2788 KB Output is correct
5 Correct 8 ms 2848 KB Output is correct
6 Correct 7 ms 2652 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 109 ms 8488 KB Output is correct
9 Correct 60 ms 7920 KB Output is correct
10 Correct 173 ms 25428 KB Output is correct
11 Correct 177 ms 25736 KB Output is correct
12 Correct 230 ms 25932 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 119 ms 8052 KB Output is correct
15 Correct 38 ms 5208 KB Output is correct
16 Correct 639 ms 25872 KB Output is correct
17 Correct 348 ms 34664 KB Output is correct
18 Correct 339 ms 34664 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 2 ms 532 KB Output is correct
4 Correct 8 ms 2652 KB Output is correct
5 Correct 7 ms 2648 KB Output is correct
6 Correct 9 ms 2652 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 113 ms 8152 KB Output is correct
9 Correct 60 ms 8048 KB Output is correct
10 Correct 163 ms 25196 KB Output is correct
11 Correct 192 ms 25564 KB Output is correct
12 Correct 222 ms 25608 KB Output is correct
13 Correct 0 ms 344 KB Output is correct
14 Correct 116 ms 8200 KB Output is correct
15 Correct 36 ms 5236 KB Output is correct
16 Correct 624 ms 25456 KB Output is correct
17 Correct 349 ms 34692 KB Output is correct
18 Correct 360 ms 34328 KB Output is correct
19 Runtime error 249 ms 262144 KB Execution killed with signal 9
20 Halted 0 ms 0 KB -