Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #ifdef TEST
- #define debug(...) printf(__VA_ARGS__)
- #else
- #define debug(...) (void)0
- #endif
- #define EB emplace_back
- #define MP make_pair
- #define ST first
- #define ND second
- using namespace std;
- using ll = long long;
- using llu = long long unsigned;
- using pii = pair<int,int>;
- /************************/
- #define MAX 100000
- int N, arr[MAX+5];
- ll pref[MAX+5];
- int bsearch(int l, int r, int base, int snake);
- inline ll rngSum(int l, int r){return pref[r]-pref[l-1];}
- int main(){
- int T;
- scanf("%d", &T);
- while(T--){
- int Q;
- scanf("%d%d", &N, &Q);
- for(int i = 0 ; i < N ; i++)
- scanf("%d", &arr[i]);
- sort(arr, arr+N);
- for(int i=0;i<N;i++)
- pref[i] = ((i > 0)?pref[i-1]:0) + ll(arr[i]); // prefix sum
- debug("==LIST==\n");
- for(int i=0;i<N;i++)
- debug("%d%c", arr[i], " \n"[i==N-1]);
- for(int i = 0; i < Q; i++){
- int q;
- scanf("%d", &q);
- auto pos = lower_bound(arr, arr+N, q);
- int current = ( pos - arr ) - 1;
- int end = bsearch(0, current, current, q);
- debug("\'_>\'(%d, %d)\n", end, current);
- printf("%d\n", N-end);
- }
- }
- return 0;
- }
- int bsearch(int l, int r, int base, int snake){
- int mid;
- while(l <= r){
- mid = (l+r)/2;
- debug("(l:%d, r:%d)\n", l, r);
- debug("(%d)*%d - rngSum(%d, %d)=%lld ? %d\n", base-mid+1, snake, mid, base, rngSum(mid, base), mid);
- // [food consumption] cmp [amount of food]
- if((base-mid+1)*snake - rngSum(mid, base) == mid){
- return mid;
- }
- if((base-mid+1)*snake - rngSum(mid, base) < mid){
- r = mid-1;
- }
- if((base-mid+1)*snake - rngSum(mid, base) > mid){
- l = mid+1;
- }
- }
- return l;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement