# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
747455 | Can_I_Put_ma_ballz | Art Exhibition (JOI18_art) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iomanip>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <map>
#define endl '\n'
typedef unsigned long long int u64;
typedef long long int i64;
typedef unsigned int u32;
typedef int i32;
typedef unsigned short u16;
typedef short i16;
using namespace std;
vector<pair<i64, i64>> get_max_r(const vector<i32>& arr) {
vector<pair<i64, i64>> maxR(arr.size());
vector<pair<i64, i64>> stack;
for (int i = (int) arr.size() - 1; i >= 0; i--) {
if(stack.empty()) {
maxR[i].first = -1;
maxR[i].second = (i64) arr.size();
} else if (stack.back().first >= arr[i]) {
maxR[i].first = stack.back().first;
maxR[i].second = stack.back().second;
} else {
while (!stack.empty() && stack.back().first < arr[i]) {
stack.pop_back();
}
if (!stack.empty()) {
maxR[i].first = stack.back().first;
maxR[i].second = stack.back().second;
} else {
maxR[i].first = -1;
maxR[i].second = (i64) arr.size();
}
}
stack.emplace_back(arr[i], i);
}
return maxR;
}
vector<pair<i64, i64>> get_max_l(const vector<i32>& arr) {
vector<pair<i64, i64>> maxL(arr.size());
vector<pair<i64, i64>> stack;
for (int i = 0; i < arr.size(); i++) {
if (stack.empty()) {
maxL[i].first = -1;
maxL[i].second = -1;
} else if (stack.back().first > arr[i]) {
maxL[i].first = stack.back().first;
maxL[i].second = stack.back().second;
} else {
while (!stack.empty() && stack.back().first <= arr[i]) {
stack.pop_back();
}
if (!stack.empty()) {
maxL[i].first = stack.back().first;
maxL[i].second = stack.back().second;
} else {
maxL[i].first = -1;
maxL[i].second = -1;
}
}
stack.emplace_back(pair<int, int>(arr[i], i));
}
return maxL;
}
int main() {
ios::sync_with_stdio(NULL);cin.tie(nullptr);cout.tie(nullptr);
i64 n;
cin>>n;
i64 sum = 0;
vector<pair<i64, i64>> arr(n);
for (auto& i:arr) {
cin>>i.first>>i.second;
sum += i.second;
}
sort(arr.begin(), arr.end(), [](auto x, auto y) {
if (x.first == y.first) {
return x.second > y.second;
}
return x.first < y.first;
});
size_t l = 0, r = n-1;
i64 ans = LLONG_MIN;
while (l <= r) {
ans = max(ans, sum-(arr[r].first-arr[l].first));
if (l != r) {
i64 ml,mr;
ml=(sum-arr[l].second)-(arr[r].first-arr[l+1].first);
mr=(sum-arr[r].second)-(arr[r-1].first-arr[l].first);
if (ml > mr) {
sum -= arr[l].second;
l++;
} else {
sum -= arr[r].second;
r--;
}
} else {
break;
}
}
cout << ans << endl;
return 0;
}