Submission #1362640

#TimeUsernameProblemLanguageResultExecution timeMemory
1362640NewtonabcRobots (IOI13_robots)C++20
100 / 100
1092 ms16592 KiB
#include "robots.h"
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
const int M=1e6+10;
vector<int> f[N];
int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) {
    sort(X,X+A);
    int id=0;
    vector<pair<int,int>> v;
    for(int i=0;i<T;i++) v.push_back({W[i],S[i]});
    sort(v.begin(),v.end());
    for(int i=0;i<A;i++){
        while(id<T && v[id].first<X[i]){
            f[i].push_back(id);
            id++;
        }
    }
    while(id<T) f[A].push_back(id++);
    //f[i] is the bound of toy which is updated when iterating thorugh X[i]
    sort(Y,Y+B,greater<int>());
    int l=0,r=2*T;
    while(l<r){
        int mid=(l+r)/2;
        //queue keep the size in search space in decreasing order
        priority_queue<int> q;
        for(int i=0;i<A;i++){
            for(auto x:f[i]){
                q.push(v[x].second);
            }
            for(int j=0;j<mid;j++){
                if(!q.empty()) q.pop();
                else break;
            }
        }
        for(auto x:f[A]) q.push(v[x].second);
        //clear greedily using small robot
        for(int i=0;i<B;i++){
            for(int j=0;j<mid;j++){
                if(!q.empty()){
                    if(Y[i]>q.top()) q.pop();
                    else break;
                }
                else break;
            }
        }
        if(!q.empty()) l=mid+1;
        else r=mid;
    }
    if(l>T) return -1;
    return l;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...