Submission #1238979

#TimeUsernameProblemLanguageResultExecution timeMemory
1238979altern23Robots (IOI13_robots)C++20
100 / 100
2287 ms23304 KiB
#include "robots.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pii pair<ll, ll>
#define fi first
#define sec second

const ll INF = 2e18;

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

    vector<pii> items;
    for(int i = 0; i < T; i++) items.push_back({W[i], S[i]});
    sort(items.begin(), items.end());

    ll lf = 1, rg = T, ans = -1;
    for(;lf <= rg;){
        ll mid = (lf + rg) / 2;

        vector<ll> take_small(B + 5), take_weak(A + 5), unused;
        set<pii> st;

        for(int i = 0; i < B; i++){
            st.insert({Y[i], i});
        }

        for(int i = T - 1; i >= 0; --i){
            auto x = st.lower_bound({items[i].sec, INF});
            if(x != st.end()){
                take_small[(*x).sec]++;
                if(take_small[(*x).sec] == mid) st.erase(x);
            }
            else{
                unused.push_back(i);
            }
        }

        reverse(unused.begin(), unused.end());
        
        bool ok = 1;
        ll cur = 0;

        for(auto i : unused){
            while(cur < A && (take_weak[cur] >= mid || items[i].fi >= X[cur])) cur++;
            if(cur == A){
                ok = 0;
                break;
            }
            take_weak[cur]++;
        }

        if(ok){
            ans = mid;
            rg = mid - 1;
        }
        else lf = mid + 1;
    }
    
    return ans;
}
#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...