이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <random>
#include <iomanip>
#include <functional>
#include <cassert>
using namespace std;
typedef long long ll;
struct point {
int x, y;
point(int x, int y) : x(x), y(y) {}
point(int x) : x(x), y(x) {}
point() : x(0), y(0) {}
point operator -(const point &p) const {
return point(x - p.x, y - p.y);
}
ll operator *(const point &p) const {
return (ll)x * p.y - (ll)y * p.x;
}
int type() const {
return y > 0 || (y == 0 && x > 0);
}
bool operator ==(const point &p) const {
return x == p.x && y == p.y;
}
bool operator <(const point &b) const {
const point &a = *this;
if (a.type() != b.type()) {
return a.type() < b.type();
}
return a * b > 0;
}
};
int main() {
ios_base::sync_with_stdio(false); cin.tie(0);
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
int n;
cin >> n;
map <pair <int, int>, ll> cost;
for (int i = 0; i < n; ++i) {
int x, y, w;
cin >> x >> y >> w;
cost[{x, y}] += w;
}
n = cost.size();
vector <point> a(n); vector <int> w(n);
{
int id = 0;
for (auto it = cost.begin(); it != cost.end(); ++it, ++id) {
a[id] = point((it->first).first, (it->first).second);
w[id] = it->second;
}
}
vector <pair <point, pair <int, int>>> dir;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (i == j) continue;
dir.emplace_back(a[i] - a[j], make_pair(i, j));
}
}
sort(dir.begin(), dir.end());
vector <int> p(n);
iota(p.begin(), p.end(), 0);
sort(p.begin(), p.end(), [&] (int i, int j) {
if (a[i].y != a[j].y) return a[i].y < a[j].y;
return a[i].x > a[j].x;
});
vector <int> pos(n);
for (int i = 0; i < n; ++i) pos[p[i]] = i;
ll ans = 0;
for (auto d : dir) {
ll cur = 0;
for (int i : p) {
cur += w[i];
cur = max(cur, 0LL);
ans = max(ans, cur);
}
swap(p[pos[d.second.first]], p[pos[d.second.second]]);
swap(pos[d.second.first], pos[d.second.second]);
}
{
ll cur = 0;
for (int i : p) {
cur += w[i];
cur = max(cur, 0LL);
ans = max(ans, cur);
}
}
cout << ans << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |