Submission #394562

# Submission time Handle Problem Language Result Execution time Memory
394562 2021-04-26T21:33:58 Z rainboy Teams (IOI15_teams) C
100 / 100
941 ms 136500 KB
#include "teams.h"
#include <string.h>

#define N	500000
#define M	200000
#define LN	19	/* LN = ceil(log2(N)) */
#define N_	(N * (LN + 1))
#define INF	0x3f3f3f3f

int min(int a, int b) { return a < b ? a : b; }

unsigned int X = 12345;

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

int ii[N], tt[N + 1], n;

int *rr_;

int compare_r(int i, int j) { return rr_[i] - rr_[j]; }
int compare_k(int k1, int k2) { return k1 - k2; }

int (*compare)(int, int);

void sort(int *ii, int l, int r) {
	while (l < r) {
		int i = l, j = l, k = r, i_ = ii[l + rand_() % (r - l)], tmp;

		while (j < k) {
			int c = compare(ii[j], i_);

			if (c == 0)
				j++;
			else if (c < 0) {
				tmp = ii[i], ii[i] = ii[j], ii[j] = tmp;
				i++, j++;
			} else {
				k--;
				tmp = ii[j], ii[j] = ii[k], ii[k] = tmp;
			}
		}
		sort(ii, l, i);
		l = k;
	}
}

int ll[1 + N_], rr[1 + N_], sz[1 + N_], _ = 1;

int update(int t, int l, int r, int i) {
	int t_ = _++;

	sz[t_] = sz[t] + 1;
	if (r - l > 1) {
		int m = (l + r) / 2;

		if (i < m)
			ll[t_] = update(ll[t], l, m, i), rr[t_] = rr[t];
		else
			ll[t_] = ll[t], rr[t_] = update(rr[t], m, r, i);
	}
	return t_++;
}

int query(int t, int i) {
	int l = 0, r = n, x;

	x = 0;
	while (r - l > 1) {
		int m = (l + r) / 2;

		if (i < m)
			x += sz[rr[t]], t = ll[t], r = m;
		else
			t = rr[t], l = m;
	}
	if (i == -1)
		x += sz[t];
	return x;
}

void init(int n_, int ll[], int rr[]) {
	int h, i, t;

	n = n_;
	for (i = 0; i < n; i++)
		ii[i] = i;
	rr_ = rr, compare = compare_r, sort(ii, 0, n);
	for (h = 0, i = 0, t = 0; i <= n; i++) {
		while (h < n && rr[ii[h]] == i)
			t = update(t, 0, n, ll[ii[h++]] - 1);
		tt[i] = t;
	}
}

int dp[M + 2], kk[M], m;

int E(int i, int j) {
	int l = i == 0 ? -1 : kk[i - 1] - 1, r = j == m + 1 ? n : kk[j - 1] - 1;

	return dp[i] - query(tt[r], l);
}

int C(int i1, int i2) {
	int lower = i2, upper = m + 2;

	while (upper - lower > 1) {
		int j = (lower + upper) / 2;

		if (E(i1, j) <= E(i2, j))
			upper = j;
		else
			lower = j;
	}
	return upper;
}

int can(int m_, int *kk_) {
	static int qu[M + 2], cc[M + 2];
	int i, j, cnt;

	memcpy(kk, kk_, (m = m_) * sizeof *kk_);
	compare = compare_k, sort(kk, 0, m);
	cnt = 0;
	dp[0] = n, qu[cnt++] = 0;
	for (j = 1; j <= m + 1; j++) {
		while (cnt >= 2 && cc[cnt - 2] <= j)
			cnt--;
		dp[j] = E(qu[cnt - 1], j) - (j == m + 1 ? 0 : kk[j - 1]);
		while (cnt >= 2 && E(qu[cnt - 1], cc[cnt - 2] - 1) >= E(j, cc[cnt - 2] - 1))
			cnt--;
		qu[cnt] = j, cc[cnt - 1] = C(qu[cnt - 1], j), cnt++;
	}
	return dp[m + 1] >= 0;
}

Compilation message

teams.c: In function 'rand_':
teams.c:15:18: warning: conversion to 'int' from 'unsigned int' may change the sign of the result [-Wsign-conversion]
   15 |  return (X *= 3) >> 1;
      |         ~~~~~~~~~^~~~
teams.c: In function 'sort':
teams.c:27:16: warning: declaration of 'ii' shadows a global declaration [-Wshadow]
   27 | void sort(int *ii, int l, int r) {
      |           ~~~~~^~
teams.c:18:5: note: shadowed declaration is here
   18 | int ii[N], tt[N + 1], n;
      |     ^~
teams.c: In function 'init':
teams.c:83:23: warning: declaration of 'll' shadows a global declaration [-Wshadow]
   83 | void init(int n_, int ll[], int rr[]) {
      |                   ~~~~^~~~
teams.c:49:5: note: shadowed declaration is here
   49 | int ll[1 + N_], rr[1 + N_], sz[1 + N_], _ = 1;
      |     ^~
teams.c:83:33: warning: declaration of 'rr' shadows a global declaration [-Wshadow]
   83 | void init(int n_, int ll[], int rr[]) {
      |                             ~~~~^~~~
teams.c:49:17: note: shadowed declaration is here
   49 | int ll[1 + N_], rr[1 + N_], sz[1 + N_], _ = 1;
      |                 ^~
teams.c: In function 'can':
teams.c:123:27: warning: conversion to 'long unsigned int' from 'int' may change the sign of the result [-Wsign-conversion]
  123 |  memcpy(kk, kk_, (m = m_) * sizeof *kk_);
      |                           ^
teams.c:121:6: warning: unused variable 'i' [-Wunused-variable]
  121 |  int i, j, cnt;
      |      ^
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 0 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 0 ms 332 KB Output is correct
6 Correct 7 ms 448 KB Output is correct
7 Correct 1 ms 332 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 332 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
11 Correct 0 ms 332 KB Output is correct
12 Correct 1 ms 332 KB Output is correct
13 Correct 1 ms 332 KB Output is correct
14 Correct 1 ms 332 KB Output is correct
15 Correct 1 ms 332 KB Output is correct
16 Correct 1 ms 332 KB Output is correct
17 Correct 1 ms 332 KB Output is correct
18 Correct 1 ms 332 KB Output is correct
19 Correct 1 ms 332 KB Output is correct
20 Correct 1 ms 332 KB Output is correct
21 Correct 1 ms 332 KB Output is correct
22 Correct 1 ms 332 KB Output is correct
23 Correct 1 ms 332 KB Output is correct
24 Correct 1 ms 332 KB Output is correct
25 Correct 1 ms 332 KB Output is correct
26 Correct 1 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 73 ms 22736 KB Output is correct
2 Correct 72 ms 22608 KB Output is correct
3 Correct 72 ms 22592 KB Output is correct
4 Correct 266 ms 23816 KB Output is correct
5 Correct 37 ms 22668 KB Output is correct
6 Correct 36 ms 22580 KB Output is correct
7 Correct 37 ms 22732 KB Output is correct
8 Correct 38 ms 22564 KB Output is correct
9 Correct 79 ms 22192 KB Output is correct
10 Correct 56 ms 22084 KB Output is correct
11 Correct 32 ms 21868 KB Output is correct
12 Correct 31 ms 21904 KB Output is correct
13 Correct 38 ms 22328 KB Output is correct
14 Correct 42 ms 22096 KB Output is correct
15 Correct 63 ms 22700 KB Output is correct
16 Correct 60 ms 22652 KB Output is correct
17 Correct 37 ms 22992 KB Output is correct
18 Correct 33 ms 22920 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 176 ms 23024 KB Output is correct
2 Correct 179 ms 23068 KB Output is correct
3 Correct 184 ms 25896 KB Output is correct
4 Correct 265 ms 23816 KB Output is correct
5 Correct 137 ms 23124 KB Output is correct
6 Correct 134 ms 22976 KB Output is correct
7 Correct 154 ms 22980 KB Output is correct
8 Correct 139 ms 23012 KB Output is correct
9 Correct 79 ms 22212 KB Output is correct
10 Correct 180 ms 22308 KB Output is correct
11 Correct 148 ms 22212 KB Output is correct
12 Correct 127 ms 22212 KB Output is correct
13 Correct 136 ms 22800 KB Output is correct
14 Correct 189 ms 24424 KB Output is correct
15 Correct 120 ms 23248 KB Output is correct
16 Correct 120 ms 23124 KB Output is correct
17 Correct 101 ms 23440 KB Output is correct
18 Correct 105 ms 23548 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 787 ms 126016 KB Output is correct
2 Correct 783 ms 125976 KB Output is correct
3 Correct 879 ms 132000 KB Output is correct
4 Correct 941 ms 127688 KB Output is correct
5 Correct 487 ms 125980 KB Output is correct
6 Correct 483 ms 125976 KB Output is correct
7 Correct 518 ms 126020 KB Output is correct
8 Correct 493 ms 130884 KB Output is correct
9 Correct 486 ms 126276 KB Output is correct
10 Correct 489 ms 123540 KB Output is correct
11 Correct 423 ms 124356 KB Output is correct
12 Correct 402 ms 125408 KB Output is correct
13 Correct 678 ms 130376 KB Output is correct
14 Correct 906 ms 136500 KB Output is correct
15 Correct 556 ms 133536 KB Output is correct
16 Correct 548 ms 133428 KB Output is correct
17 Correct 357 ms 133120 KB Output is correct
18 Correct 347 ms 132960 KB Output is correct