Submission #768170

#TimeUsernameProblemLanguageResultExecution timeMemory
768170rainboyMoney (IZhO17_money)C11
45 / 100
1584 ms30340 KiB
#include <stdio.h>

#define N	1000000

unsigned int Z = 12345;

int rand_() {
	return (Z *= 3) >> 1;
}

int zz[N + 1], ll[N + 1], rr[N + 1], aa[N + 1], kk[N + 1], u_, l_, r_;

int node(int a, int k) {
	static int _ = 1;

	zz[_] = rand_();
	aa[_] = a, kk[_] = k;
	return _++;
}

void split(int u, int a) {
	if (u == 0) {
		u_ = l_ = r_ = 0;
		return;
	}
	if (aa[u] < a) {
		split(rr[u], a);
		rr[u] = l_, l_ = u;
	} else if (aa[u] > a) {
		split(ll[u], a);
		ll[u] = r_, r_ = u;
	} else {
		u_ = u, l_ = ll[u], r_ = rr[u];
		ll[u] = rr[u] = 0;
	}
}

int merge(int u, int v) {
	if (u == 0)
		return v;
	if (v == 0)
		return u;
	if (zz[u] < zz[v]) {
		rr[u] = merge(rr[u], v);
		return u;
	} else {
		ll[v] = merge(u, ll[v]);
		return v;
	}
}

void tr_update(int a, int k) {
	split(u_, a);
	if (u_ == 0)
		u_ = node(a, k);
	else if ((kk[u_] += k) == 0)
		u_ = 0;
	u_ = merge(merge(l_, u_), r_);
}

int tr_floor(int a) {
	int u = u_, a_ = -1;

	while (u)
		if (aa[u] <= a)
			a_ = aa[u], u = rr[u];
		else
			u = ll[u];
	return a_;
}

int main() {
	static int aa[N];
	int n, i, j, k, a;

	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		scanf("%d", &aa[i]);
		tr_update(aa[i], 1);
	}
	k = 0;
	for (j = n - 1; j >= 0; j = i) {
		i = j - 1;
		while (i >= 0 && aa[i] == aa[j])
			i--;
		tr_update(aa[j], -(j - i));
		a = aa[j] - 1;
		while (i >= 0 && aa[i] == tr_floor(a))
			tr_update(aa[i], -1), a = aa[i], i--;
		k++;
	}
	printf("%d\n", k);
	return 0;
}

Compilation message (stderr)

money.c: In function 'main':
money.c:76:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |  scanf("%d", &n);
      |  ^~~~~~~~~~~~~~~
money.c:78:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |   scanf("%d", &aa[i]);
      |   ^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...