This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 xx[N * 2], ii[N * 2], tt[N + 1], n;
int compare_x(int i, int j) { return xx[i] - xx[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 * 2; i++) {
xx[i] = (i & 1) == 0 ? ll[i >> 1] : rr[i >> 1] + 1;
ii[i] = i;
}
compare = compare_x, sort(ii, 0, n * 2);
for (h = 0, i = 0, t = 0; i <= n; i++) {
while (h < n * 2 && xx[ii[h]] - 1 == i) {
if ((ii[h] & 1) == 1)
t = update(t, 0, n, xx[ii[h] ^ 1] - 1);
h++;
}
tt[i] = t;
}
}
int iq[1 + N], pq[N], cnt;
int lt(int i, int j) { return xx[i << 1 | 1] < xx[j << 1 | 1]; }
int p2(int p) {
return (p *= 2) > cnt ? 0 : (p < cnt && lt(iq[p + 1], iq[p]) ? p + 1 : p);
}
void pq_up(int i) {
int p, q, j;
for (p = pq[i]; (q = p / 2) && lt(i, j = iq[q]); p = q)
iq[pq[j] = p] = j;
iq[pq[i] = p] = i;
}
void pq_dn(int i) {
int p, q, j;
for (p = pq[i]; (q = p2(p)) && lt(j = iq[q], i); p = q)
iq[pq[j] = p] = j;
iq[pq[i] = p] = i;
}
void pq_add(int i) {
pq[i] = ++cnt, pq_up(i);
}
void pq_remove(int i) {
if (pq[i]) {
int j = iq[cnt--];
if (j != i)
pq[j] = pq[i], pq_up(j), pq_dn(j);
pq[i] = 0;
}
}
void pq_remove_first() {
pq_remove(iq[1]);
}
int greedy(int *kk, int m) {
int h, i;
compare = compare_k, sort(kk, 0, m);
memset(pq, 0, n * sizeof *pq), cnt = 0;
for (h = 0, i = 0; h < m; h++) {
while (i < n * 2 && xx[ii[i]] <= kk[h]) {
int i_ = ii[i++];
if ((i_ & 1) == 0)
pq_add(i_ >> 1);
else
pq_remove(i_ >> 1);
}
if (cnt < kk[h])
return 0;
while (kk[h]--)
pq_remove_first();
}
return 1;
}
int hall(int *kk, int m) {
static int dp[M + 2];
int i, j;
dp[0] = n;
for (j = 1; j <= m + 1; j++) {
int r = j == m + 1 ? n : kk[j - 1] - 1;
dp[j] = INF;
for (i = 0; i < j; i++) {
int l = i == 0 ? -1 : kk[i - 1] - 1;
dp[j] = min(dp[j], dp[i] - query(tt[r], i == 0 ? -1 : kk[i - 1] - 1));
}
dp[j] -= j == m + 1 ? 0 : kk[j - 1];
}
return dp[m + 1] >= 0;
}
int can(int m, int kk[]) {
int j;
compare = compare_k, sort(kk, 0, m);
return m >= 300 ? greedy(kk, m) : hall(kk, m);
}
Compilation message (stderr)
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:25:16: warning: declaration of 'ii' shadows a global declaration [-Wshadow]
25 | void sort(int *ii, int l, int r) {
| ~~~~~^~
teams.c:18:16: note: shadowed declaration is here
18 | int xx[N * 2], ii[N * 2], tt[N + 1], n;
| ^~
teams.c: In function 'init':
teams.c:81:23: warning: declaration of 'll' shadows a global declaration [-Wshadow]
81 | void init(int n_, int ll[], int rr[]) {
| ~~~~^~~~
teams.c:47:5: note: shadowed declaration is here
47 | int ll[1 + N_], rr[1 + N_], sz[1 + N_], _ = 1;
| ^~
teams.c:81:33: warning: declaration of 'rr' shadows a global declaration [-Wshadow]
81 | void init(int n_, int ll[], int rr[]) {
| ~~~~^~~~
teams.c:47:17: note: shadowed declaration is here
47 | int ll[1 + N_], rr[1 + N_], sz[1 + N_], _ = 1;
| ^~
teams.c: In function 'greedy':
teams.c:146:18: warning: conversion to 'long unsigned int' from 'int' may change the sign of the result [-Wsign-conversion]
146 | memset(pq, 0, n * sizeof *pq), cnt = 0;
| ^
teams.c: In function 'hall':
teams.c:174:8: warning: unused variable 'l' [-Wunused-variable]
174 | int l = i == 0 ? -1 : kk[i - 1] - 1;
| ^
teams.c: In function 'can':
teams.c:184:6: warning: unused variable 'j' [-Wunused-variable]
184 | int j;
| ^| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |