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/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;
typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;
typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 2000;
int ad(int a, int b) { return a+b; }
int sub(int a, int b) { return a-b; }
pi operator+(const pi& l, const pi& r) { return {ad(l.f,r.f),ad(l.s,r.s)}; }
pi operator-(const pi& l, const pi& r) { return {sub(l.f,r.f),sub(l.s,r.s)}; }
pi operator+=(pi& l, const pi& r) { return l = l+r; }
pi operator-=(pi& l, const pi& r) { return l = l-r; }
int N;
pair<pi,int> A[MX];
bool done[MX][MX];
vector<pair<pi,vi>> al;
ll ans = 0;
struct node {
ll sum,mn,mx,ans;
node(int w) {
sum = w;
mn = min(0,w);
mx = ans = max(0,w);
}
node(): node(0) {}
};
node comb(const node& l, const node& r) {
node res(0);
res.ans = max(max(l.ans,r.ans),l.sum+r.mx-l.mn);
res.mn = min(l.sum+r.mn,l.mn);
res.mx = max(l.sum+r.mx,l.mx);
res.sum = l.sum+r.sum;
return res;
};
struct Seg {
int ind[2000], rind[2000];
node seg[4096];
void init() {
F0R(i,N) {
rind[i] = ind[i] = i;
seg[i^(1<<11)] = node(A[i].s);
}
FORd(i,1,1<<11) seg[i] = comb(seg[2*i],seg[2*i+1]);
}
void upd(int ind) {
ind ^= (1<<11);
for (ind /= 2; ind; ind /= 2) seg[ind] = comb(seg[2*ind],seg[2*ind+1]);
}
void flip(vi v) {
int mn = MOD, mx = -MOD;
for (int i: v) mn = min(mn,ind[i]), mx = max(mx,ind[i]);
assert(mx-mn+1 == sz(v));
for (int i = mn; i < mx+mn-i; ++i) {
swap(seg[i^(1<<11)],seg[(mx+mn-i)^(1<<11)]);
swap(rind[i],rind[mx+mn-i]);
swap(ind[rind[i]],ind[rind[mx+mn-i]]);
upd(i); upd(mx+mn-i);
}
}
};
Seg S;
void ins(vi v) {
F0R(i,sz(v)) FOR(j,i+1,sz(v)) done[v[i]][v[j]] = done[v[j]][v[i]] = 1;
al.pb({A[v[1]].f-A[v[0]].f,v});
}
ll cross(pi b, pi c) {
return (ll)b.f*c.s-(ll)b.s*c.f;
}
ll cross(pi a, pi b, pi c) { return cross(b-a,c-a); }
bool cmp(pi a, pi b) { return cross(a,b) > 0; }
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> N;
F0R(i,N) cin >> A[i].f.f >> A[i].f.s >> A[i].s;
if (N == 1) {
cout << max(0,A[0].s);
exit(0);
}
sort(A,A+N,[](pair<pi,int> x, pair<pi,int> y) {
if (x.f.s != y.f.s) return x.f.s < y.f.s;
return x.f.f < y.f.f;
});
S.init();
/*F0R(i,N) cout << A[i].f.f << " " << A[i].f.s << "\n";
cout << "\n";*/
F0R(i,N) {
vi v; FOR(j,i+1,N) v.pb(j);
sort(all(v),[&i](int a, int b) { return cmp(A[a].f-A[i].f,A[b].f-A[i].f); });
for (int ind = 0; ind < sz(v); ) {
if (done[i][v[ind]]) {
ind ++;
continue;
}
int IND = ind;
vi tmp = {i};
while (ind < sz(v) && cross(A[i].f,A[v[IND]].f,A[v[ind]].f) == 0) tmp.pb(v[ind++]);
// cout << "OOPS " << IND << " " << ind << "\n";
// cout << A[i].f << " " << A[IND].f << " " << A[ind].f << "\n";
ins(tmp);
}
/*cout << A[i].f.f << " " << A[i].f.s << "\n";
for (auto x: v) cout << A[x].f.f << " " << A[x].f.s << " | ";
cout << "\n";*/
}
sort(all(al), [](pair<pi,vi> a, pair<pi,vi> b) { return cmp(a.f,b.f); });
/*for (auto a: al) {
cout << a.f.f << " " << a.f.s << " | ";
for (int i: a.s) cout << i << " ";
cout << "\n";
}*/
for (int i = 0; i < sz(al); ) {
int I = i;
while (i < sz(al) && cross(al[I].f,al[i].f) == 0) S.flip(al[i++].s);
ans = max(ans,S.seg[1].ans);
}
cout << ans;
}
/* Look for:
* the exact constraints (multiple sets are too slow for n=10^6 :( )
* special cases (n=1?)
* overflow (ll vs int?)
* array bounds
*/
# | 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... |