Submission #344840

#TimeUsernameProblemLanguageResultExecution timeMemory
344840dimashiiMoney (IZhO17_money)C++17
45 / 100
1591 ms58952 KiB
#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) {
	if (l > r) return 0;
	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;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...