답안 #344839

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
344839 2021-01-06T15:57:08 Z dimashii Money (IZhO17_money) C++17
0 / 100
1 ms 512 KB
#include <bits/stdc++.h>

using namespace std;

const int mxN = 1e6 + 123;

int A[mxN], B[mxN], f[mxN], R[mxN];

void Upd(int pos) {
	for (int i = pos; i < mxN; i |= i + 1) ++f[i];
}

int Get(int pos) {
	int ans = 0;
	for (int i = pos; i >= 0; i &= i + 1, --i) ans += f[i];
	return ans;
}

int Count(int l, int r) {
	return Get(r) - Get(l - 1);
}

int main() {
	ios_base :: sync_with_stdio(false); cin.tie(nullptr); 
	int N; cin >> N;
	for (int i = 1; i <= N; ++i) cin >> A[i];
	R[N] = N;
	for (int i = N - 1; i > 0; i--) {
		if (A[i] <= A[i + 1]) R[i] = R[i + 1];
		else R[i] = i;
	}
	set <int> st;
	int ans = 0;
	for (int i = 1; i <= N; ++i) {
		++ans;
		if (i == 1) {
			for (int j = i; j <= R[i]; ++j) Upd(A[j]), st.insert(A[j]);
			i = R[i];
			continue;
		}
		if (A[i] >= *(--st.end())) {
			for (int j = i; j <= R[i]; ++j) Upd(A[j]), st.insert(A[j]);
			i = R[i];
			continue;
		}int lb = i, rb = R[i], j = i;
		while (rb >= lb) {
			int md = (lb + rb) / 2;
			// can or not
			if (A[md] <= *st.begin()) {
				j = md;
				lb = md + 1;
				continue;
			}
			int l = *st.upper_bound(A[i]);
			int r = *(--st.lower_bound(A[md]));
			if (!Count(l, r)) {
				j = md;
				lb = md + 1;
			}else rb = md - 1;
		}
		for (int k = i; k <= j; ++k) Upd(A[k]), st.insert(A[k]);
		i = j;
	}
	cout << ans;
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 364 KB Output is correct
5 Correct 1 ms 364 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 1 ms 492 KB Output is correct
10 Incorrect 1 ms 512 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 364 KB Output is correct
5 Correct 1 ms 364 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 1 ms 492 KB Output is correct
10 Incorrect 1 ms 512 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 364 KB Output is correct
5 Correct 1 ms 364 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 1 ms 492 KB Output is correct
10 Incorrect 1 ms 512 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 364 KB Output is correct
5 Correct 1 ms 364 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 1 ms 492 KB Output is correct
10 Incorrect 1 ms 512 KB Output isn't correct
11 Halted 0 ms 0 KB -