Submission #1208757

#TimeUsernameProblemLanguageResultExecution timeMemory
1208757peraRobots (IOI13_robots)C++20
76 / 100
3093 ms10496 KiB
#include<bits/stdc++.h>
#include "robots.h"
using namespace std;

int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) {
   sort(X , X + A);
   sort(Y , Y + B);
   auto igA = [&](int x){
      int p = -1;
      for(int bit = 17;bit >= 0;bit --){
         p += 1 << bit;
         if(p >= A){
            p -= 1 << bit;
         }else if(X[p] > x){
            p -= 1 << bit;
         }
      }
      ++p;
      return A - p;
   };
   auto igB = [&](int x){
      int p = -1;
      for(int bit = 17;bit >= 0;bit --){
         p += 1 << bit;
         if(p >= B){
            p -= 1 << bit;
         }else if(Y[p] > x){
            p -= 1 << bit;
         }
      }
      ++p;
      return B - p;
   };
   vector<int> cA(T) , cB(T);
   for(int i = 0;i < T;i ++){
      cA[i] = igA(W[i]);
      cB[i] = igB(S[i]);
      if(cA[i] + cB[i] == 0){
         return -1;
      }
   }
   vector<int> oy(T);
   iota(oy.begin() , oy.end() , 0);
   sort(oy.begin() , oy.end() , [&](int i , int j){
      return pair<int , int>{cB[i] , -cA[i]} < pair<int , int>{cB[j] , -cA[j]};
   });
   reverse(oy.begin() , oy.end());
   auto solveB = [&](vector<int> v){
      vector<int> c(B + 1);
      for(int x : v){
         c[x]++;
      }
      int ans = 0;
      for(int i = 1;i <= B;i ++){
         c[i] += c[i - 1];
         ans = max(ans , (c[i] + i - 1) / i);
      }
      return ans;
   };
   auto pos = [&](int v){
      vector<int> pref(A + 1) , left;
      for(int i = 1;i <= A;i ++){
         pref[i] = min(1000000LL , 1LL * i * v);
      }
      auto can_insert = [&](int x){
         int mn = 1E9;
         for(int i = A;i >= x;i --){
            mn = min(mn , pref[i]);
         }
         return mn > 0;
         //return (query(1 , 1 , A , x , A) > 0);
      };
      auto insert = [&](int x){
         for(int i = A;i >= x;i --){
            --pref[i];
         }
        // update(1 , 1 , A , x , A , -1);
      };
      for(int i = 0;i < T;i ++){
         if(!cA[i]){
            left.emplace_back(cB[i]);
         }else if(!cB[i]){
            if(!can_insert(cA[i])){
               return false;
            }
            insert(cA[i]);
         }
      }
      for(int i = T - 1;i >= 0;i --){
         int j = oy[i];
         if(!cA[j] || !cB[j]){
            continue;
         }
         if(can_insert(cA[j])){
            insert(cA[j]);
         }else{
            left.emplace_back(cB[j]);
         }
      }
      return solveB(left) <= v;
   };
   int ans = 0;
   for(int bit = 20;bit >= 0;bit --){
      ans += 1 << bit;
      if(pos(ans) == true){
         ans -= 1 << bit;
      }
   }
   ++ans;
   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...