Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void cal(ll K, ll &mn, ll &mnX, vector<ll> &A, vector<ll> &xLeft, vector<ll> &xRight, vector<ll> &sufLeft,
- vector<ll> &preRight)
- {
- for (ll i = 0; i < K; i++)
- {
- // let x be xLeft -> sufLeft + preRight
- ll cur = 0;
- auto it = upper_bound(xLeft.begin(), xLeft.end(), A[i]);
- if (it != xLeft.end())
- {
- ll pos = it - xLeft.begin();
- cur += sufLeft[pos] - (K - pos) * A[i];
- }
- it = lower_bound(xRight.begin(), xRight.end(), A[i]);
- if (it != xRight.begin())
- {
- it--;
- ll pos = it - xRight.begin();
- cur += ((pos + 1) * A[i]) - preRight[pos];
- }
- if (cur < mn)
- {
- mn = cur;
- mnX = A[i];
- }
- else if (cur == mn)
- {
- mnX = min(A[i], mnX);
- }
- }
- }
- void solve()
- {
- ll K;
- cin >> K;
- vector<ll> xLeft, xRight, yDown, yUp;
- for (ll i = 0; i < K; i++)
- {
- ll x1, y1, x2, y2;
- cin >> x1 >> y1 >> x2 >> y2;
- xLeft.push_back(x1);
- xRight.push_back(x2);
- yDown.push_back(y1);
- yUp.push_back(y2);
- }
- sort(xLeft.begin(), xLeft.end());
- sort(xRight.begin(), xRight.end());
- sort(yDown.begin(), yDown.end());
- sort(yUp.begin(), yUp.end());
- vector<ll> preRight(K), sufLeft(K), preUp(K), sufDown(K);
- for (ll i = 0; i < K; i++)
- {
- preRight[i] = xRight[i];
- preUp[i] = yUp[i];
- if (i > 0)
- {
- preRight[i] += preRight[i - 1];
- preUp[i] += preUp[i - 1];
- }
- }
- for (ll i = K - 1; i >= 0; i--)
- {
- sufLeft[i] = xLeft[i];
- sufDown[i] = yDown[i];
- if (i < K - 1)
- {
- sufLeft[i] += sufLeft[i + 1];
- sufDown[i] += sufDown[i + 1];
- }
- }
- ll mn = maxl, mnX = 1e10, mnY = 1e10;
- cal(K, mn, mnX, xLeft, xLeft, xRight, sufLeft, preRight);
- cal(K, mn, mnX, xRight, xLeft, xRight, sufLeft, preRight);
- mn = maxl;
- cal(K, mn, mnY, yDown, yDown, yUp, sufDown, preUp);
- cal(K, mn, mnY, yUp, yDown, yUp, sufDown, preUp);
- cout << "Case #" << cas << ": " << mnX << " " << mnY << endl;
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement