Advertisement
Rohit4Pal

workout

Jun 27th, 2021
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define mod     1000000007
  5. #define ll      long long
  6. #define pb      push_back
  7. #define pob     pop_back
  8. #define pq      priority_queue<int>
  9. #define pii     pair<int,int>
  10. #define ff      first
  11. #define ss      second
  12. #define vi      vector<int>
  13.  
  14. void fastIO() {
  15.     ios_base::sync_with_stdio(false);
  16.     cin.tie(NULL);
  17. }
  18. int findSegments(vector<ll> diff,ll x){
  19.  
  20.     int k=0;
  21.  
  22.     // ex- 1,4,6,10 and mid=5 , so we start from index of 6
  23.     int i=upper_bound(diff.begin(),diff.end(),x)-diff.begin();
  24.     for(;i<diff.size();i++)
  25.         k+=ceil(diff[i]/x)-1;
  26.     return k;
  27. }
  28. int main() {
  29.  
  30.     fastIO();
  31.     int t,itr=1;
  32.     cin >> t;
  33.     while (itr<=t) {
  34.  
  35.         int n,req_k,curr_k;
  36.         cin>>n>>req_k;
  37.         vector<ll> arr(n),diff(n-1);
  38.         for(ll &i:arr)
  39.             cin>>i;
  40.         for(int i=0;i<n-1;i++){
  41.             diff[i]=arr[i+1]-arr[i];
  42.         }
  43.  
  44.         sort(diff.begin(),diff.end());
  45.         if(req_k==1){
  46.             if(n==1)
  47.                 printf("Case #%d: %lld\n",itr,diff[0]/2);
  48.             else {
  49.                 ll d1=diff[diff.size()-1],d2=diff[diff.size()-2];
  50.                 d1/=2;
  51.                 printf("Case #%d: %lld\n",itr,((d1>d2)?d1:d2));
  52.             }
  53.         }else{
  54.  
  55.             ll start=diff[0],end=diff[diff.size()-1],mid=0;
  56.  
  57.             while(start<end){
  58.                 mid=start+(end-start)/2;
  59.  
  60.                 //find no of k's req to satisfy diff=mid
  61.                 curr_k=findSegments(diff,mid);
  62.  
  63.                 if(curr_k>req_k)
  64.                     start=mid+1;
  65.                 else    end=mid;    //we want immediate right
  66.             }
  67.             printf("Case #%d: %lld\n",itr,start);
  68.         }
  69.         itr++;
  70.     }
  71.     return 0;
  72. }
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement