Submission #581893

#TimeUsernameProblemLanguageResultExecution timeMemory
581893tranxuanbachRobots (IOI13_robots)C++17
76 / 100
3059 ms21696 KiB
#ifndef FEXT

#include "robots.h"

#endif

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define endl '\n'
#define fi first
#define se second
#define For(i, l, r) for (auto i = l; i < r; i++)
#define ForE(i, l, r) for (auto i = l; i <= r; i++)
#define FordE(i, l, r) for (auto i = l; i >= r; i--)
#define Fora(v, a) for (auto v: a)
#define bend(a) a.begin(), a.end()
#define isz(a) ((signed)a.size())

using ll = long long;
using ld = long double;
using pii = pair <int, int>;
using vi = vector <int>;
using vpii = vector <pair <int, int>>;
using vvi = vector <vector <int>>;

const int N = 5e4 + 5, M = 1e6 + 5;

int n1, n2, m;
pii a[M];
int b[N], c[N];

bool ck[M];

auto cmp1 = [](int i, int j){
    return a[i].se < a[j].se;
};

auto cmp2 = [](int i, int j){
    return a[i].se > a[j].se;
};

priority_queue <int, vi, decltype(cmp1)> pq1(cmp1);
priority_queue <int, vi, decltype(cmp2)> pq2(cmp2);

int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]){
    n1 = A; n2 = B; m = T;
    For(i, 0, n1){
        b[i] = X[i];
    }
    For(i, 0, n2){
        c[i] = Y[i];
    }
    For(i, 0, m){
        a[i] = make_pair(W[i], S[i]);
    }

    sort(a, a + m, [&](const pii &lhs, const pii &rhs){
        return lhs.fi < rhs.fi;
    });
    sort(b, b + n1);
    sort(c, c + n2);

    int lo = 1, hi = m + 1;
    while (lo < hi){
        int mid = (lo + hi) >> 1;

        fill(ck, ck + m, 0);
        while (!pq1.empty()){
            pq1.pop();
        }
        while (!pq2.empty()){
            pq2.pop();
        }

        int j = 0;
        For(i, 0, n1){
            while (j < m and a[j].fi < b[i]){
                pq1.emplace(j);
                j++;
            }
            ForE(turn, 1, mid){
                if (pq1.empty()){
                    break;
                }
                int j = pq1.top(); pq1.pop();
                ck[j] = 1;
            }
        }

        For(i, 0, m){
            if (!ck[i]){
                pq2.emplace(i);
            }
        }

        For(i, 0, n2){
            ForE(turn, 1, mid){
                if (pq2.empty() or a[pq2.top()].se >= c[i]){
                    break;
                }
                pq2.pop();
            }
        }

        if (pq2.empty()){
            hi = mid;
        }
        else{
            lo = mid + 1;
        }
    }
    if (lo == m + 1){
        lo = -1;
    }
    return lo;
}

#ifdef FEXT

#define fail(s, x...) do { \
        fprintf(stderr, s "\n", ## x); \
        exit(1); \
    } while(0)

#define MAX_A 50000
#define MAX_B 50000
#define MAX_T 500000

static int X[MAX_A];
static int Y[MAX_B];
static int W[MAX_T];
static int S[MAX_T];

signed main(){
    // ios_base::sync_with_stdio(0);
    // cin.tie(0); cout.tie(0);
    // freopen("KEK.inp", "r", stdin);
    freopen("KEK.out", "w", stdout);
    int A, B, T, i;
    int res;

    FILE *f = fopen("KEK.inp", "r");
    if (!f)
        fail("Failed to open input file.");

    res = fscanf(f, "%d", &A);
    if (res != 1)
        fail("Failed to read A from input file.");
    if (A < 0 || A > MAX_A)
        fail("A is out of bounds.");

    res = fscanf(f, "%d", &B);
    if (res != 1)
        fail("Failed to read B from input file.");
    if (B < 0 || B > MAX_B)
        fail("B is out of bounds.");

    res = fscanf(f, "%d", &T);
    if (res != 1)
        fail("Failed to read T from input file.");
    if (T < 1 || T > MAX_T)
        fail("T is out of bounds.");

    for (i = 0; i < A; i++) {
        res = fscanf(f, "%d", &X[i]);
        if (res != 1)
            fail("Failed to read data from input file.");
    }
    for (i = 0; i < B; i++) {
        res = fscanf(f, "%d", &Y[i]);
        if (res != 1)
            fail("Failed to read data from input file.");
    }
    for (i = 0; i < T; i++) {
        res = fscanf(f, "%d%d", &W[i], &S[i]);
        if (res != 2)
            fail("Failed to read data from input file.");
    }
    fclose(f);

    int answer = putaway(A, B, T, X, Y, W, S);

    printf("%d\n", answer);

    return 0;
}

#endif

/*
==================================================+
INPUT:                                            |
--------------------------------------------------|

--------------------------------------------------|
==================================================+
OUTPUT:                                           |
--------------------------------------------------|

--------------------------------------------------|
==================================================+
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...