Submission #1178829

#TimeUsernameProblemLanguageResultExecution timeMemory
1178829anmattroiTeams (IOI15_teams)C++17
0 / 100
592 ms162400 KiB
#include "teams.h"
#include <bits/stdc++.h>
#define maxn 500005
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;

int n;
int a[maxn], b[maxn], prefixSum[maxn], Lef[maxn], Rig[maxn], prefixMax[maxn], secondarySum[maxn];
int it[22*maxn], L[22*maxn], R[22*maxn], root[maxn], nt = 0;

int build(int lo = 1, int hi = n) {
    if (lo == hi) return ++nt;
    int cur = ++nt, mid = (lo + hi) >> 1;
    L[cur] = build(lo, mid);
    R[cur] = build(mid+1, hi);
    return cur;
}

int upd(int u, int oldver, int lo = 1, int hi = n) {
    if (lo == hi) {
        it[++nt] = it[oldver] + 1;
        return nt;
    }
    int cur = ++nt, mid = (lo + hi) >> 1;
    if (u <= mid) {
        L[cur] = upd(u, L[oldver], lo, mid);
        R[cur] = R[oldver];
    } else {
        L[cur] = L[oldver];
        R[cur] = upd(u, R[oldver], mid+1, hi);
    }
    it[cur] = it[L[cur]] + it[R[cur]];
    return cur;
}

int get(int u, int v, int r, int lo = 1, int hi = n) {
    if (u <= lo && hi <= v) return it[r];
    int mid = (lo + hi) >> 1;
    return (u <= mid ? get(u, v, L[r], lo, mid) : 0) +
           (v > mid ? get(u, v, R[r], mid+1, hi) : 0);
}

vector<int> adj[maxn];

void init(int N, int A[], int B[]) {
    n = N;
    for (int i = 0; i < N; i++) a[i] = A[i];
    for (int i = 0; i < N; i++) b[i] = B[i];
    for (int i = 0; i < N; i++) adj[a[i]].emplace_back(b[i]);
    sort(a, a + N);
    sort(b, b + N);
    root[0] = build();
    for (int i = 1; i <= N; i++) {
        root[i] = root[i-1];
        for (int j : adj[i]) root[i] = upd(j, root[i]);
    }
}

int can(int M, int K[]) {
    sort(K, K+M);
    int64_t sum = 0;
    for (int i = 0; i < M; i++) sum += K[i];
    if (sum > n) return 0;

    for (int i = 0; i < M; i++) {
        prefixSum[i+1] = prefixSum[i] + K[i];
        Lef[i+1] = lower_bound(b, b+n, K[i])-b;
        Rig[i+1] = n-(upper_bound(a, a+n, K[i])-a);
        if (i+1 < M) secondarySum[i+1] = secondarySum[i] + (K[i] + 1 < K[i+1] ? get(K[i] + 1, K[i+1]-1, root[K[i+1]-1]) - get(K[i]+1, K[i+1]-1, root[K[i]]) : 0);
    }
    prefixMax[0] = INT_MIN;
    for (int i = 1; i <= M; i++) prefixMax[i] = max(prefixMax[i-1], Lef[i] - prefixSum[i-1] - secondarySum[i-1]);
    int ans = INT_MAX;
    for (int i = 1; i <= M; i++) ans = min(ans, n - prefixMax[i] - (Rig[i] + prefixSum[i] + secondarySum[i-1]));
    return (ans >= 0);
}

/*
4
1 2
2 3
2 3
2 4
2
2 1 3
2 1 1
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...