Submission #638104

#TimeUsernameProblemLanguageResultExecution timeMemory
638104beaconmcRobots (IOI13_robots)C++14
0 / 100
1 ms212 KiB
#include "robots.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

typedef long long ll;
using namespace std;
using namespace __gnu_pbds;

#define FOR(i, x, y) for(ll i=x; i<y; i++)
#define FORNEG(i, x, y) for(ll i=x; i>y; i--)
#define ordered_set tree<ll, null_type,less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update>
#define fast() ios_base::sync_with_stdio(false);cin.tie(NULL)



int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) {
    sort(X,X+A);
    sort(Y,Y+B);
    FOR(i,0,T){
        W[i]++;
        S[i]++;
    }


    FOR(i,0,T){
        if (W[i] > X[A-1] && S[i] > Y[B-1]){
            return -1;
        }
    }

    FOR(i,0,T){
        W[i] = lower_bound(X,X+A, W[i])-X;
    }

    vector<pair<ll,ll>> realsus;
    FOR(i,0,T){
        realsus.push_back(make_pair(W[i],-S[i]));
    }
    sort(realsus.begin(), realsus.end());
    reverse(realsus.begin(),realsus.end());



    



    const auto check = [&](int k) -> bool{
        priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater_equal<pair<ll,ll>>> sus;
        priority_queue<ll, vector<ll>, greater_equal<ll>> sus2;


        FOR(i,0,A){

            while (realsus.size() && realsus[realsus.size()-1].first <= i){
                sus.push(make_pair(realsus[realsus.size()-1].second, realsus[realsus.size()-1].second));
                realsus.pop_back();
            }
            

            ll cnt = 0;
            while (sus.size()!=0){
                if (cnt==k) break;
                cnt++;
                sus.pop();
            }

        }

        
        while (sus.size()!=0){
            ll temp = sus.top().second;
            sus.pop();
            sus2.push(-temp);
        }


        FOR(i,0,B){
            ll cnt = 0;
            while (sus2.size()!=0){
                if (cnt==k) break;
                ll temp = sus2.top();
                if (temp > Y[i]) break;
                cnt++;
                sus2.pop();
            }


        }





        if (sus2.size()) return 0;
        else return 1;

    };

    ll lo = 0;
    ll hi = T+1;



    while (lo<hi){
        ll mid = lo + (hi - lo) / 2;
        if (check(mid)) hi = mid;
        else lo = mid + 1;
    }

    return lo;


}
#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...