This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define DEBUG
#define fi first
#define se second
#define pb push_back
using namespace std;
//using namespace __gnu_pbds;
typedef long long LL;
typedef pair<int,int> pii;
typedef vector<int> vi;
//template<typename T>
//using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,
// tree_order_statistics_node_update>; // find_by_order, order_of_key
template<class F, class S>
ostream& operator<< (ostream& os, const pair<F, S> p){
os << '{' << p.fi << ", " << p.se << '}';
return os;
}
template<class T>
ostream& operator<< (ostream& os, const vector<T>& v){
os << '{';
for (int i = 0, t = v.size(); i < t; i++) os << v[i] << (i+1==t?", " : "}");
return os;
}
const int INF = 0x3f3f3f3f;
const LL LINF = 1e18;
//////////////////END OF TEMPLATE//////////////////////////////
void read();
struct pt{
int x, y, v;
pt(int x = 0, int y = 0, int v = 0): x(x), y(y), v(v) {}
bool operator== (const pt &rhs) const{ return x == rhs.x && y == rhs.y;}
bool operator< (const pt &rhs) const{ return x == rhs.x ? y < rhs.y : x < rhs.x; }
pt operator+ (const pt &rhs){
return pt(x + rhs.x, y + rhs.y, 0);
}
pt operator- (const pt &rhs){
return pt(x + rhs.x, y + rhs.y, 0);
}
LL operator* (const pt &rhs){
return x * rhs.y - y * rhs.x;
}
};
struct Node{
LL a, p, s, b;
Node(LL v = 0): b(v), a(v), p(v), s(v) {}
};
inline Node merge(Node l, Node r){
Node x;
x.a = l.a + r.a;
x.p = max(l.p, l.a + r.p);
x.s = max(l.s + r.a, r.s);
x.b = max(l.b, r.b);
x.b = max(x.b, l.s + r.p);
return x;
}
int n;
pt pts[2005];
Node st[2005 << 2];
void build(int p = 1, int l = 1, int r = n){
if (l ==r){
st[p] = Node(pts[l].v);
//cout << l << ' ' << st[p].v << ' ' << st[p].b << '\n';
return;
}
int md = (l + r) >> 1;
build(p<<1, l, md);
build(p<<1|1, md+1, r);
st[p] = merge(st[p<<1], st[p<<1|1]);
}
void upd(int i, int v, int p = 1, int l = 1, int r = n){
if (l == r) return void(st[p] = Node(v));
int md = (l + r) >> 1;
if (i <= md) upd(i, v, p<<1, l, md);
else upd(i, v, p<<1|1, md+1, r);
st[p] = merge(st[p<<1], st[p<<1|1]);
}
Node query(int i, int j, int p = 1, int l = 1, int r = n){
if (j < l || i > r){
Node ret(-LINF); ret.a = 0;
return ret;
}
if (i <= l && j >= r) return st[p];
int md = (l + r) >> 1;
return merge(query(i, j, p<<1, l, md), query(i, j, p<<1|1, md+1, r));
}
void printTree(int p = 1, int l = 1, int r = n){
cout << "pos " << p << " rng " << make_pair(l, r) << " : " ;
cout << st[p].a << ' ' << st[p].b << ' ' << st[p].p << ' ' << st[p].s << '\n';
if (l == r) return;
int md = (l + r) >> 1;
printTree(p<<1, l, md);
printTree(p<<1|1, md+1, r);
}
LL get(){
return st[1].b;
}
int pos[2005], rpos[2005];
vector<pii> vec;
bool eqv(pii a, pii b){
LL dxa = pts[a.se].x - pts[a.fi].x;
LL dya = pts[a.se].y - pts[a.fi].y;
LL dxb = pts[b.se].x - pts[b.fi].x;
LL dyb = pts[b.se].y - pts[b.fi].y;
if (dxa < 0) dxa = -dxa, dya = -dya;
if (dxb < 0) dxb = -dxb, dyb = -dyb;
return dya * dxb == dyb * dxa;
}
bool cmp(pii a, pii b){
if (eqv(a, b)){
if (pts[a.fi] < pts[a.se]) swap(a.fi, a.se);
if (pts[b.fi] < pts[b.se]) swap(b.fi, b.se);
return pts[a.fi] == pts[a.se] ? pts[b.fi] < pts[b.se] : pts[a.fi] < pts[a.se];
}
LL dxa = pts[a.se].x - pts[a.fi].x;
LL dya = pts[a.se].y - pts[a.fi].y;
LL dxb = pts[b.se].x - pts[b.fi].x;
LL dyb = pts[b.se].y - pts[b.fi].y;
if (dxa < 0) dxa = -dxa, dya = -dya;
if (dxb < 0) dxb = -dxb, dyb = -dyb;
return dya * dxb < dyb * dxa;
}
bool cmp2(pii a, pii b){
if (a.fi > a.se) swap(a.fi, a.se);
if (b.fi > b.se) swap(b.fi, b.se);
return a < b;
}
vector<pii> curr;
#undef DEBUG
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
read();
build();
for (int i = 1; i <= n; i++){
pos[i] = rpos[i] = i;
for (int j = i+1; j <= n; j++){
vec.push_back(make_pair(i, j));
}
}
LL mx = 0LL;
mx = max(mx, get());
sort(vec.begin(), vec.end(), cmp);
for (pii v : vec){
if (curr.empty() || eqv(curr.back(), v)){
curr.push_back(v);
} else {
sort(curr.begin(), curr.end());
for (pii ii : curr){
swap(pos[ii.fi], pos[ii.se]);
upd(pos[ii.fi], pts[ii.fi].v);
upd(pos[ii.se], pts[ii.se].v);
}
mx = max(mx, get());
curr.clear();
curr.push_back(v);
}
}
cout << mx << '\n';
return 0;
}
inline void read(){
cin >> n;
for (int i = 1; i <= n; i++) cin >> pts[i].x >> pts[i].y >> pts[i].v;
sort(pts+1, pts+n+1);
}
Compilation message (stderr)
bulldozer.cpp: In constructor 'Node::Node(LL)':
bulldozer.cpp:50:14: warning: 'Node::b' will be initialized after [-Wreorder]
LL a, p, s, b;
^
bulldozer.cpp:50:5: warning: 'LL Node::a' [-Wreorder]
LL a, p, s, b;
^
bulldozer.cpp:51:2: warning: when initialized here [-Wreorder]
Node(LL v = 0): b(v), a(v), p(v), s(v) {}
^~~~
# | 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... |