Advertisement
Valkyrie006

Untitled

Oct 16th, 2021
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. void cal(ll K, ll &mn, ll &mnX, vector<ll> &A, vector<ll> &xLeft, vector<ll> &xRight, vector<ll> &sufLeft,
  2.          vector<ll> &preRight)
  3. {
  4.     for (ll i = 0; i < K; i++)
  5.     {
  6.         // let x be xLeft -> sufLeft + preRight
  7.         ll cur = 0;
  8.         auto it = upper_bound(xLeft.begin(), xLeft.end(), A[i]);
  9.         if (it != xLeft.end())
  10.         {
  11.             ll pos = it - xLeft.begin();
  12.             cur += sufLeft[pos] - (K - pos) * A[i];
  13.         }
  14.         it = lower_bound(xRight.begin(), xRight.end(), A[i]);
  15.         if (it != xRight.begin())
  16.         {
  17.             it--;
  18.             ll pos = it - xRight.begin();
  19.             cur += ((pos + 1) * A[i]) - preRight[pos];
  20.         }
  21.         if (cur < mn)
  22.         {
  23.             mn = cur;
  24.             mnX = A[i];
  25.         }
  26.         else if (cur == mn)
  27.         {
  28.             mnX = min(A[i], mnX);
  29.         }
  30.     }
  31. }
  32.  
  33. void solve()
  34. {
  35.     ll K;
  36.     cin >> K;
  37.     vector<ll> xLeft, xRight, yDown, yUp;
  38.     for (ll i = 0; i < K; i++)
  39.     {
  40.         ll x1, y1, x2, y2;
  41.         cin >> x1 >> y1 >> x2 >> y2;
  42.         xLeft.push_back(x1);
  43.         xRight.push_back(x2);
  44.         yDown.push_back(y1);
  45.         yUp.push_back(y2);
  46.     }
  47.     sort(xLeft.begin(), xLeft.end());
  48.     sort(xRight.begin(), xRight.end());
  49.     sort(yDown.begin(), yDown.end());
  50.     sort(yUp.begin(), yUp.end());
  51.     vector<ll> preRight(K), sufLeft(K), preUp(K), sufDown(K);
  52.     for (ll i = 0; i < K; i++)
  53.     {
  54.         preRight[i] = xRight[i];
  55.         preUp[i] = yUp[i];
  56.         if (i > 0)
  57.         {
  58.             preRight[i] += preRight[i - 1];
  59.             preUp[i] += preUp[i - 1];
  60.         }
  61.     }
  62.     for (ll i = K - 1; i >= 0; i--)
  63.     {
  64.         sufLeft[i] = xLeft[i];
  65.         sufDown[i] = yDown[i];
  66.         if (i < K - 1)
  67.         {
  68.             sufLeft[i] += sufLeft[i + 1];
  69.             sufDown[i] += sufDown[i + 1];
  70.         }
  71.     }
  72.     ll mn = maxl, mnX = 1e10, mnY = 1e10;
  73.     cal(K, mn, mnX, xLeft, xLeft, xRight, sufLeft, preRight);
  74.     cal(K, mn, mnX, xRight, xLeft, xRight, sufLeft, preRight);
  75.  
  76.     mn = maxl;
  77.     cal(K, mn, mnY, yDown, yDown, yUp, sufDown, preUp);
  78.     cal(K, mn, mnY, yUp, yDown, yUp, sufDown, preUp);
  79.     cout << "Case #" << cas << ": " << mnX << " " << mnY << endl;
  80.     return;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement