Submission #1059421

#TimeUsernameProblemLanguageResultExecution timeMemory
1059421vjudge1로봇 (IOI13_robots)C++17
53 / 100
160 ms24160 KiB
#include "robots.h"
#include<bits/stdc++.h>
#define ll long long

using namespace std;

vector<pair<int,int>> Tw,Ts;
int a, b, t;
vector<int> x, y;

bool bcheck(int n){
    int pos=0,cnt=n,toys_cnt1=0,toys_cnt2=0;
    vector<bool> Tbool1(t,0), Tbool2(t,0);

    for(int i=0; i < t; i++){
        if(Tw[i].first < x[pos]){
            cnt--;
            toys_cnt1++;
            Tbool1[Tw[i].second] = 1;
        }
        if(cnt == 0){
            cnt = n;
            pos++;
        }
        if(pos >= a)break;
    }
    if(b == 0)return toys_cnt1 == t;

    pos = 0; cnt = n;
    for(int i=0; i < t; i++){
        if(Ts[i].first < y[pos] && !Tbool1[Ts[i].second]){
            cnt--;
            toys_cnt1++;
            Tbool1[Ts[i].second] = 1;
        }
        if(cnt == 0){
            cnt = n;
            pos++;
        }
        if(pos >= b)break;
    }

    if(b != 0){
        pos = 0; cnt = n;
        for(int i=0; i < t; i++){
            if(Ts[i].first < y[pos]){
                cnt--;
                toys_cnt2++;
                Tbool2[Ts[i].second] = 1;
            }
            if(cnt == 0){
                cnt = n;
                pos++;
            }
            if(pos >= b)break;
        }
        if(a == 0)return toys_cnt2 == t;

        pos = 0; cnt = n;
        for(int i=0; i < t; i++){
            if(Tw[i].first < x[pos] && !Tbool2[Tw[i].second]){
                cnt--;
                toys_cnt2++;
                Tbool2[Tw[i].second] = 1;
            }
            if(cnt == 0){
                cnt = n;
                pos++;
            }
            if(pos >= a)break;
        }
    }

    return toys_cnt1 == t || toys_cnt2 == t;
}

int binary(int l, int r){
    int n;

    while(l <= r){
        n = (l+r)/2;

        if(bcheck(n)){
            r = n-1;
        }else{
            l = n+1;
        }
    }

    return l;
}

int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) {
    int ans=-1;

    if(T == 2 && A+B == 2){
        for(int i=0; i < T; i++){
            Tw.push_back({W[i],S[i]});
            Ts.push_back({S[i],W[i]});
        }
        sort(Tw.rbegin(),Tw.rend());
        sort(Ts.rbegin(),Ts.rend());
        
        int r1=0,r2=0;
        if(A == 2){
            for(int i=0; i < T; i++){
                if(Tw[i].first < X[0]){
                    r1++;
                }
                if(Tw[i].first < X[1]){
                    r2++;
                }
            }
        }else if(B == 2){
            for(int i=0; i < T; i++){
                if(Ts[i].first < Y[0]){
                    r1++;
                }
                if(Ts[i].first < Y[1]){
                    r2++;
                }
            }
        }else{
            for(int i=0; i < T; i++){
                if(Tw[i].first < X[0]){
                    r1++;
                }
            }
            for(int i=0; i < T; i++){
                if(Ts[i].first < Y[0]){
                    r2++;
                }
            }
        }

        ans=-1;
        if((r1 == 2 && r2 >= 1) || (r2 == 2 && r1 >= 1)){
            ans = 1;
        }else if((r1 == 2 && r2 == 0) || (r2 == 2 && r1 == 0)){
            ans = 2;
        }else if(r1 == 1 && r2 == 1){
            int a,b;
            for(int i=0; i < T; i++){
                if(Tw[i].first < X[0]){
                    a = i;
                }
                if(Tw[i].second < Y[0]){
                    b = i;
                }
            }
            if(a != b){
                ans = 1;
            }
        }
        return ans;
    }

    a = A; b = B; t = T;
    for(int i=0; i < A; i++){
        x.push_back(X[i]);
    }
    sort(x.rbegin(),x.rend());
    for(int i=0; i < B; i++){
        y.push_back(Y[i]);
    }
    sort(y.rbegin(),y.rend());
    for(int i=0; i < T; i++){
        Tw.push_back({W[i],i});
        Ts.push_back({S[i],i});
    }
    sort(Tw.rbegin(),Tw.rend());
    sort(Ts.rbegin(),Ts.rend());
    
    ans=binary(1,T);

    if(ans > T)ans = -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...