Advertisement
mickypinata

TOI15: Minimum Load Requirement

Nov 8th, 2021
914
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long lli;
  5. typedef tuple<int, int, int> tiii;
  6.  
  7. const int N = 10;
  8. const int S = 1e7;
  9.  
  10. vector<tiii> liftAssistPairs;
  11. int lift[N + 1], assist[N + 1], student[S + 1], limTime[N + 1], divide[N + 2];
  12. bool liftChosen[N + 1], assistChosen[N + 1];
  13.  
  14. int main(){
  15.  
  16.     int n, nStudent, Q;
  17.     scanf("%d%d%d", &n, &nStudent, &Q);
  18.     for(int i = 1; i <= n; ++i){
  19.         scanf("%d", &lift[i]);
  20.     }
  21.     for(int i = 1; i <= n; ++i){
  22.         scanf("%d", &assist[i]);
  23.     }
  24.     for(int i = 1; i <= nStudent; ++i){
  25.         scanf("%d", &student[i]);
  26.     }
  27.  
  28.     for(int i = 1; i <= n; ++i){
  29.         for(int j = 1; j <= n; ++j){
  30.             liftAssistPairs.emplace_back(lift[i] - assist[j], i, j);
  31.         }
  32.     }
  33.     sort(liftAssistPairs.begin(), liftAssistPairs.end());
  34.  
  35.     for(int q = 1; q <= Q; ++q){
  36.         scanf("%d", &limTime[q]);
  37.     }
  38.     for(int q = 1; q <= Q; ++q){
  39.         for(int i = 1; i <= n; ++i){
  40.             liftChosen[i] = false;
  41.             assistChosen[i] = false;
  42.             scanf("%d", &divide[i]);
  43.         }
  44.         divide[n + 1] = nStudent + 1;
  45.         vector<int> req;
  46.         bool broken = false;
  47.         for(int i = 1; i <= n; ++i){
  48.             int ans = 2e9 + 200;
  49.             int l = 0;
  50.             int r = 2e9 + 200;
  51.             while(l <= r){
  52.                 int m = ((lli)l + r) / 2;
  53.                 int sum = 0;
  54.                 int cnt = 0;
  55.                 for(int j = divide[i]; j < divide[i + 1]; ++j){
  56.                     if(student[j] > m){
  57.                         cnt = 1e9;
  58.                         break;
  59.                     }
  60.                     if(sum + student[j] > m){
  61.                         sum = 0;
  62.                     }
  63.                     if(sum == 0){
  64.                         ++cnt;
  65.                     }
  66.                     sum += student[j];
  67.                 }
  68.                 if(cnt <= limTime[q]){
  69.                     ans = min(ans, m);
  70.                     r = m - 1;
  71.                 } else {
  72.                     l = m + 1;
  73.                 }
  74.             }
  75.             req.push_back(ans);
  76.         }
  77.         sort(req.begin(), req.end());
  78.         int j = lower_bound(liftAssistPairs.begin(), liftAssistPairs.end(), tiii(req[0], 0, 0)) - liftAssistPairs.begin();
  79.         for(int i = 0; i < req.size(); ++i){
  80.             while(j < liftAssistPairs.size() && (get<0>(liftAssistPairs[j]) < req[i] ||
  81.                 liftChosen[get<1>(liftAssistPairs[j])] || assistChosen[get<2>(liftAssistPairs[j])])){
  82.                 ++j;
  83.             }
  84.             if(j == liftAssistPairs.size()){
  85.                 broken = true;
  86.                 break;
  87.             }
  88.             liftChosen[get<1>(liftAssistPairs[j])] = true;
  89.             assistChosen[get<2>(liftAssistPairs[j])] = true;
  90.         }
  91.         if(broken){
  92.             cout << "F\n";
  93.         } else {
  94.             cout << "P\n";
  95.         }
  96.     }
  97.  
  98.     return 0;
  99. }
  100.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement