Submission #466602

#TimeUsernameProblemLanguageResultExecution timeMemory
466602blueRobots (IOI13_robots)C++17
0 / 100
1 ms204 KiB
#include "robots.h"
#include <vector>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;


int A; //# weak robots
vector<int> X;

int B; //# small robots
vector<int> Y;

int T; //# toys
vector<int> W;
vector<int> S;

struct toyW
{
    int k;
};

bool operator < (toyW P, toyW Q)
{
    if(W[P.k] == W[Q.k]) return P.k < Q.k;
    return W[P.k] < W[Q.k];
}

struct toyS
{
    int k;
};

bool operator < (toyS P, toyS Q)
{
    if(S[P.k] == S[Q.k]) return P.k < Q.k;
    return S[P.k] < S[Q.k];
}

set<toyW> T_W1;
set<toyS> T_S1;
set<toyW> TW1, TW2;
set<toyS> TS1, TS2;

int putaway(int a, int b, int t, int x[], int y[], int w[], int s[])
{

    A = a;
    X = vector<int>(A);
    for(int i = 0; i < A; i++) X[i] = x[i];
    sort(X.begin(), X.end(), [] (int u, int v)
    {
        return u < v;
    });

    // cerr << "check\n";


    B = b;
    Y = vector<int>(B);
    for(int j = 0; j < B; j++) Y[j] = y[j];
    sort(Y.begin(), Y.end(), [] (int u, int v)
    {
        return u < v;
    });
    // cerr << "check\n";


    T = t;
    W = S = vector<int>(T);
    for(int k = 0; k < T; k++)
    {
        W[k] = w[k];
        S[k] = s[k];

        // cerr << "k = " << k << '\n';

        if((X.empty() || W[k] >= X.back()) && (Y.empty() || S[k] >= Y.back()))
            return -1;
    }
    // cerr << "checking\n";
    // cerr << "check\n";

    for(int k = 0; k < T; k++)
    {
        T_W1.insert(toyW{k});
        T_S1.insert(toyS{k});
    }


    int lo = 1;
    int hi = T;
    while(lo != hi)
    {
        TW1 = T_W1;
        TW2.clear();
        TS1 = T_S1;
        TS2.clear();

        // cerr << "searching range " << a << ' ' << b << '\n';

        int m = (lo+hi)/2; //The maximum capacity of any robot.

        for(int x: X) //weak robots
        {
            // cerr << "x = " << x << '\n';
            while(!TW1.empty() && W[TW1.begin()->k] < x)
            {
                int k = TW1.begin()->k;

                TW1.erase(toyW{k});
                TS1.erase(toyS{k});

                TW2.insert(toyW{k});
                TS2.insert(toyS{k});
            }
            int ctr = 0;
            while(!TS2.empty() && ctr < m)
            {
                ctr++;
                int k = TS2.rbegin()->k;
                TS2.erase(toyS{k});
                TW2.erase(toyW{k});
            }
        }
        while(!TW1.empty())
        {
            int k = TW1.rbegin()->k;

            TW1.erase(toyW{k});
            TS1.erase(toyS{k});

            TW2.insert(toyW{k});
            TS2.insert(toyS{k});
        }

        for(int y: Y) //small robots
        {
            // cerr << "y = " << y << '\n';
            int ctr = 0;
            while(!TS2.empty() && S[TS2.begin()->k] < y && ctr < m)
            {
                ctr++;
                TS2.erase(TS2.begin());
            }
        }

        if(!TS2.empty())
            lo = m+1;
        else
            hi = m;

    }

    return a;
}
#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...