Advertisement
Zuneve

solution

Aug 29th, 2023
1,027
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. typedef long long ll;
  3. using namespace std;
  4. bool c(pair<int, int> &a, pair <int ,int> &b) {
  5.     return a.second - a.first>=b.second-b.first;
  6. }
  7. int main() {
  8.     int t;
  9.     cin >> t;
  10.     while (t--) {
  11.         int n, m;
  12.         cin >> n >> m;
  13.         vector <pair <int, int>> hachi(n), vip, us;
  14.         for (int i = 0; i < n; i++) {
  15.             cin >> hachi[i].first >> hachi[i].second;
  16.             if (hachi[i].second>hachi[i].first) vip.emplace_back(hachi[i].first, hachi[i].second);
  17.             else us.emplace_back(hachi[i].first, hachi[i].second);
  18.         }
  19.         sort(vip.begin(), vip.end(), c);
  20.         ll k = us.size();
  21.         ll ans = 0;
  22.         if (k==1) {
  23.             if (!vip.empty()) {
  24.                 if (m - vip.size()<2) {
  25.                     for (int i = 0; i<n; i++) {
  26.                         ans+=hachi[i].first;
  27.                     }
  28.                      cout << ans << '\n';
  29.                     continue;
  30.                 } else {
  31.                     vector <pair <int, int>> cur_vip = vip;
  32.                     int left = cur_vip.size() - 1;
  33.                     ll cur_ans = us[0].first + cur_vip[left].first;
  34.                     cur_vip.erase(cur_vip.begin()+left);
  35.                     ll cnt = 2 * cur_vip.size() - m + 2;
  36.                     if (!cur_vip.empty() && cur_vip.size()-cnt>0) {
  37.                         for (int i = 0; i<cur_vip.size() - cnt; i++) {
  38.                             cur_ans+=cur_vip[i].second;
  39.                         } for (int i = cur_vip.size() - cnt; i<cur_vip.size(); i++) {
  40.                             cur_ans+=cur_vip[i].first;
  41.                         }
  42.                     }
  43.                     if (vip.size() * 2 + 1<=m) {
  44.                         for (int i = 0; i<vip.size(); i++) {
  45.                             ans+=vip[i].second;
  46.                         }cout << max(ans+us[0].second, cur_ans)<< '\n';
  47.                         continue;
  48.                     } else {
  49.                         vip.push_back(us[0]);
  50.                         sort(vip.begin(), vip.end(), c);
  51.                         k = 2 * n - m;
  52.                         if (n-k>0) {
  53.                             for (int i = 0; i<n-k; i++) {
  54.                                 ans+=vip[i].second;
  55.                             } for (int i = n - k; i<n; i++) {
  56.                                 ans+=vip[i].first;
  57.                             }
  58.                         }
  59.                         cout << max(ans, cur_ans) << '\n';
  60.                         continue;
  61.                     }
  62.                 }
  63.             } else {
  64.                 cout << us[0].second << '\n';
  65.                 continue;
  66.             }
  67.         } else if (k!=0){
  68.             ll cnt = 2 * vip.size() + us.size() - m;
  69.             for (int i = 0; i<us.size(); i++) {
  70.                 ans+=us[i].first;
  71.             } if (!vip.empty() && vip.size() - cnt>0) {
  72.                 for (int i = 0; i<vip.size() - cnt; i++) {
  73.                     ans+=vip[i].second;
  74.                 } for (int i = vip.size() - cnt; i<vip.size(); i++) {
  75.                     ans+=vip[i].first;
  76.                 }
  77.             } cout << ans << '\n';
  78.         } else {
  79.             if (n*2-1<=m) {
  80.                 for (int i = 0; i<vip.size(); i++) {
  81.                     ans+=vip[i].second;
  82.                 } cout << ans << '\n';
  83.             } else {
  84.                 ll k = 2 * n - m;
  85.                 if (k==1 && n==1) {
  86.                     cout << hachi[0].second << '\n';
  87.                     continue;
  88.                 } else if (k==1){
  89.                     int ind, mn = 1000000000;
  90.  
  91.                     for (int i = 0; i<n; i++) {
  92.                         if (vip[i].second - vip[i].first < mn) {
  93.                             ind = i;
  94.                             mn = vip[i].second - vip[i].first;
  95.                         }
  96.                     }for (int i = 0; i<n; i++) {
  97.                         if (i == ind) {
  98.                             ans+=vip[i].first;
  99.                         } else {
  100.                             ans+=vip[i].second;
  101.                         }
  102.                     } cout << ans << '\n';
  103.                     continue;
  104.                 } else {
  105.                     if (n-k>0) {
  106.                         for (int i = 0; i<n-k; i++) {
  107.                             ans+=vip[i].second;
  108.                         } for (int i = n - k; i<n; i++) {
  109.                             ans+=vip[i].first;
  110.                         }
  111.                     }
  112.                      cout << ans << '\n';
  113.                     continue;
  114.                 }
  115.             }
  116.         }
  117.     }
  118.  
  119.  
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement