Advertisement
Guest User

road construction

a guest
Mar 22nd, 2021
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #pragma GCC optimize("O3")
  3.  
  4. using namespace std;
  5.  
  6. template<typename T> void check_max(T &a, const T &b){ a = (a > b) ? a : b; }
  7. template<typename T> void check_min(T &a, const T &b){ a = (a < b) ? a : b; }
  8. typedef long long ll;
  9. const int N = 25e4 + 3;
  10. const ll INF = 4e9;
  11.  
  12. int n, k;
  13. pair<ll, ll> p[N];
  14.  
  15. bool check(ll mid){
  16.     ll cnt = 0;
  17.     for(int i = 0; i < n && cnt < k; ++i)
  18.         for(int j = i + 1; j < n && cnt < k && p[j].first - p[i].first <= mid; ++j)
  19.             cnt += (p[j].first - p[i].first + abs(p[i].second - p[j].second)) <= mid;
  20.     return cnt >= k;
  21. }
  22.  
  23. vector<ll> get_cheapest_roads(ll mid){
  24.     vector<ll> cr;
  25.     for(int i = 0; i < n; ++i)
  26.         for(int j = i + 1; j < n && p[j].first - p[i].first < mid; ++j){
  27.             ll curr = (p[j].first - p[i].first + abs(p[i].second - p[j].second));
  28.             if(curr < mid)
  29.                 cr.push_back(curr);
  30.         }
  31.     sort(cr.begin(), cr.end());
  32.     while(cr.size() < k)
  33.         cr.push_back(mid);
  34.     return cr;
  35. }
  36.  
  37. int main(){
  38.     ios::sync_with_stdio(false);
  39.     cin.tie(NULL);
  40.  
  41.     cin >> n >> k;
  42.     for(int i = 0; i < n; ++i)
  43.         cin >> p[i].first >> p[i].second;
  44.     sort(p, p + n);
  45.  
  46.     ll l = 0, r = INF;
  47.     while(l != r){
  48.         ll mid = (l + r) >> 1;
  49.         if(check(mid)) r = mid;
  50.         else l = mid + 1;
  51.     }
  52.     vector<ll> cr = get_cheapest_roads(l);
  53.     for(ll x: cr)
  54.         cout << x << "\n";
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement