Advertisement
jw910731

LSSH-W2-PB-WA

Jul 10th, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #ifdef TEST
  3.     #define debug(...) printf(__VA_ARGS__)
  4. #else
  5.     #define debug(...) (void)0
  6. #endif
  7. #define EB emplace_back
  8. #define MP make_pair
  9. #define ST first
  10. #define ND second
  11. using namespace std;
  12. using ll = long long;
  13. using llu = long long unsigned;
  14. using pii = pair<int,int>;
  15. /************************/
  16. #define MAX 100000
  17. int N, arr[MAX+5];
  18. ll pref[MAX+5];
  19. int bsearch(int l, int r, int base, int snake);
  20. inline ll rngSum(int l, int r){return pref[r]-pref[l-1];}
  21. int main(){
  22.     int T;
  23.     scanf("%d", &T);
  24.     while(T--){
  25.         int Q;
  26.         scanf("%d%d", &N, &Q);
  27.         for(int i = 0 ; i < N ; i++)
  28.             scanf("%d", &arr[i]);
  29.         sort(arr, arr+N);
  30.         for(int i=0;i<N;i++)
  31.             pref[i] = ((i > 0)?pref[i-1]:0) + ll(arr[i]); // prefix sum
  32.         debug("==LIST==\n");
  33.         for(int i=0;i<N;i++)
  34.             debug("%d%c", arr[i], " \n"[i==N-1]);
  35.         for(int i = 0; i < Q; i++){
  36.             int q;
  37.             scanf("%d", &q);
  38.             auto pos = lower_bound(arr, arr+N, q);
  39.             int current = ( pos - arr ) - 1;
  40.             int end = bsearch(0, current, current, q);
  41.             debug("\'_>\'(%d, %d)\n", end, current);
  42.             printf("%d\n", N-end);
  43.         }
  44.     }
  45.     return 0;
  46. }
  47. int bsearch(int l, int r, int base, int snake){
  48.     int mid;
  49.     while(l <= r){
  50.         mid = (l+r)/2;
  51.         debug("(l:%d, r:%d)\n", l, r);
  52.         debug("(%d)*%d - rngSum(%d, %d)=%lld ? %d\n", base-mid+1, snake, mid, base, rngSum(mid, base), mid);
  53.         // [food consumption] cmp [amount of food]
  54.         if((base-mid+1)*snake - rngSum(mid, base) == mid){
  55.             return mid;
  56.         }
  57.         if((base-mid+1)*snake - rngSum(mid, base) < mid){
  58.             r = mid-1;
  59.         }
  60.         if((base-mid+1)*snake - rngSum(mid, base) > mid){
  61.             l = mid+1;
  62.         }
  63.     }
  64.     return l;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement