Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define x first
  6. #define y second
  7. #define mp make_pair
  8. #define pb push_back
  9. #define sqr(a) ((a) * (a))
  10. #define sz(a) int(a.size())
  11. #define all(a) a.begin(), a.end()
  12. #define forn(i, n) for(int i = 0; i < int(n); i++)
  13. #define fore(i, l, r) for(int i = int(l); i < int(r); i++)
  14.  
  15. typedef long long li;
  16. typedef long double ld;
  17. typedef pair<int, int> pt;
  18.  
  19. template <class A, class B> ostream& operator << (ostream& out, const pair<A, B> &a) {
  20.     return out << "(" << a.x << ", " << a.y << ")";
  21. }
  22.  
  23. template <class A> ostream& operator << (ostream& out, const vector<A> &v) {
  24.     out << "[";
  25.     forn(i, sz(v)) {
  26.         if(i) out << ", ";
  27.         out << v[i];
  28.     }
  29.     return out << "]";
  30. }
  31.  
  32. mt19937 rnd(time(NULL));
  33.  
  34. const int INF = int(1e9);
  35. const li INF64 = li(1e18);
  36. const int MOD = INF + 7;
  37. const ld EPS = 1e-9;
  38. const ld PI = acos(-1.0);
  39.  
  40. const int N = 100 * 1000 + 13;
  41.  
  42. int n, k;
  43. pt a[N];
  44.  
  45. bool read () {
  46.     if (scanf("%d%d", &n, &k) != 2)
  47.         return false;
  48.     forn(i, n)
  49.         scanf("%d%d", &a[i].x, &a[i].y);
  50.     return true;
  51. }
  52.  
  53. int t[4 * N];
  54. li f[N];
  55.  
  56. void upd(int x, int val){
  57.     for (int i = x; i < N; i |= i + 1)
  58.         f[i] += val;
  59. }
  60.  
  61. li get(int x){
  62.     li res = 0;
  63.     for (int i = x; i >= 0; i = (i & (i + 1)) - 1)
  64.         res += f[i];
  65.     return res;
  66. }
  67.  
  68. void build(int v, int l, int r){
  69.     if (l == r - 1){
  70.         t[v] = 1;
  71.         return;
  72.     }
  73.    
  74.     int m = (l + r) / 2;
  75.    
  76.     build(v * 2, l, m);
  77.     build(v * 2 + 1, m, r);
  78.    
  79.     t[v] = t[v * 2] + t[v * 2 + 1];
  80. }
  81.  
  82. void upd(int v, int l, int r, int pos){
  83.     if (l == r - 1){
  84.         --t[v];
  85.         return;
  86.     }
  87.    
  88.     int m = (l + r) / 2;
  89.    
  90.     if (pos < m)
  91.         upd(v * 2, l, m, pos);
  92.     else
  93.         upd(v * 2 + 1, m, r, pos);
  94.    
  95.     t[v] = t[v * 2] + t[v * 2 + 1];
  96. }
  97.  
  98. li get(int v, int l, int r, int tot){
  99.     if (l == r - 1)
  100.         return get(l);
  101.    
  102.     int m = (l + r) / 2;
  103.    
  104.     if (tot - t[v * 2] <= 0)
  105.         return get(v * 2, l, m, tot);
  106.     else
  107.         return get(v * 2 + 1, m, r, tot - t[v * 2]);
  108. }
  109.  
  110. int pos[N];
  111.  
  112. void solve() {
  113.     sort(a, a + n);
  114.    
  115.     build(1, 0, n);
  116.     memset(f, 0, sizeof(f));
  117.    
  118.     vector<pt> nums;
  119.     forn(i, n) nums.pb(mp(a[i].x + a[i].y, i));
  120.     sort(all(nums));
  121.     forn(i, n) pos[nums[i].y] = i;
  122.    
  123.     forn(i, n) upd(pos[i], a[i].x + a[i].y);
  124.    
  125.     set<pt, greater<pt>> l;
  126.     li sum = 0;
  127.     li ans = INF64;
  128.    
  129.     forn(i, n){
  130.         int j = i;
  131.         int x = a[i].x;
  132.        
  133.         upd(pos[i], -a[i].y - a[i].x);
  134.         upd(1, 0, n, pos[i]);
  135.        
  136.         l.insert(mp(a[i].y - a[i].x, i));
  137.         sum += a[i].y - a[i].x;
  138.        
  139.         while (j + 1 < n && a[j + 1].x == a[i].x){
  140.             ++j;
  141.            
  142.             upd(pos[j], -a[j].y - a[j].x);
  143.             upd(1, 0, n, pos[j]);
  144.            
  145.             l.insert(mp(a[j].y - a[j].x, j));
  146.             sum += a[j].y - a[j].x;
  147.         }
  148.        
  149.         while (sz(l) > k){
  150.             sum -= l.begin()->x;
  151.             l.erase(l.begin());
  152.         }
  153.        
  154.         while (!l.empty() && t[1] + sz(l) > k){
  155.             li sum1 = sum + get(1, 0, n, k - sz(l)) + li(x) * (sz(l) - (k - sz(l)));
  156.             li sum2 = sum - l.begin()->x + get(1, 0, n, k - sz(l) + 1) + li(x) * ((sz(l) - 1) - (k - sz(l) + 1));
  157.            
  158.             if (sum2 > sum1)
  159.                 break;
  160.            
  161.             sum -= l.begin()->x;
  162.             l.erase(l.begin());
  163.         }
  164.        
  165.         if (sz(l) + t[1] >= k)
  166.             ans = min(ans, sum + get(1, 0, n, k - sz(l)) + li(x) * (sz(l) - (k - sz(l))));
  167.        
  168.         i = j;
  169.     }
  170.    
  171.     printf("%lld\n", ans);
  172. }
  173.  
  174. int main() {
  175. #ifdef _DEBUG
  176.     freopen("input.txt", "r", stdin);
  177. //  freopen("output.txt", "w", stdout);
  178.    
  179.     int tt = clock();
  180.    
  181. #endif
  182.    
  183.     cerr.precision(15);
  184.     cout.precision(15);
  185.     cerr << fixed;
  186.     cout << fixed;
  187.  
  188. #ifdef _DEBUG
  189.     while(read()) {
  190. #else
  191.     if(read()) {
  192. #endif
  193.         solve();
  194.        
  195. #ifdef _DEBUG
  196.     cerr << "TIME = " << clock() - tt << endl;
  197.     tt = clock();
  198. #endif
  199.  
  200.     }
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement