Submission #1315725

#TimeUsernameProblemLanguageResultExecution timeMemory
1315725abcd123456Bulldozer (JOI17_bulldozer)C++20
0 / 100
2 ms956 KiB
#include <bits/stdc++.h>
#define itachi ios::sync_with_stdio(0);cin.tie(0);
#define int long long
using namespace std;

const int MAXN = 2005;
const long double PI = acosl(-1.0L);
const long double EPS = 1e-12;

int n;
int X[MAXN], Y[MAXN], W[MAXN];

struct Node {
    int sum, pre, suf, best;
    Node(int v=0){
        sum = v;
        pre = suf = best = max(0LL, v);
    }
};

Node st[4*MAXN];

Node merge(const Node &L, const Node &R){
    Node res;
    res.sum = L.sum + R.sum;
    res.pre = max(L.pre, L.sum + R.pre);
    res.suf = max(R.suf, R.sum + L.suf);
    res.best = max({L.best, R.best, L.suf + R.pre});
    return res;
}

void build(int id,int l,int r,vector<int> &a){
    if(l==r){ st[id]=Node(a[l]); return; }
    int m=(l+r)>>1;
    build(id<<1,l,m,a);
    build(id<<1|1,m+1,r,a);
    st[id]=merge(st[id<<1],st[id<<1|1]);
}

void update(int id,int l,int r,int p,int v){
    if(l==r){ st[id]=Node(v); return; }
    int m=(l+r)>>1;
    if(p<=m) update(id<<1,l,m,p,v);
    else update(id<<1|1,m+1,r,p,v);
    st[id]=merge(st[id<<1],st[id<<1|1]);
}

struct Event{
    long double ang;
    int u,v;
    bool operator<(const Event& o)const{
        if(fabsl(ang-o.ang)>EPS) return ang<o.ang;
        return u<o.u;
    }
};

signed main(){
    itachi
    cin>>n;
    for(int i=1;i<=n;i++) cin>>X[i]>>Y[i]>>W[i];

    vector<Event> ev;
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++){
            long double ang = atan2l(Y[j]-Y[i], X[j]-X[i]);
            if(ang<0) ang+=PI;
            ev.push_back({ang,i,j});
        }

    sort(ev.begin(),ev.end());

    vector<int> ord(n+1), pos(n+1);
    iota(ord.begin()+1, ord.end(), 1);

    sort(ord.begin()+1, ord.end(), [&](int a,int b){
        if(X[a]!=X[b]) return X[a]<X[b];
        return Y[a]<Y[b];
    });

    for(int i=1;i<=n;i++) pos[ord[i]]=i;

    vector<int> a(n+1);
    for(int i=1;i<=n;i++) a[i]=W[ord[i]];
    build(1,1,n,a);

    int ans = st[1].best;

    for(int i=0;i<(int)ev.size();){
        int j=i;
        while(j<(int)ev.size() && fabsl(ev[j].ang-ev[i].ang)<=EPS) j++;

        vector<pair<int,int>> sw;
        for(int k=i;k<j;k++){
            int u=ev[k].u, v=ev[k].v;
            int pu=pos[u], pv=pos[v];
            if(pu!=pv) sw.push_back({min(pu,pv), max(pu,pv)});
        }

        sort(sw.begin(), sw.end());
        for(auto [pu,pv]:sw){
            swap(ord[pu], ord[pv]);
            pos[ord[pu]]=pu;
            pos[ord[pv]]=pv;
            update(1,1,n,pu,W[ord[pu]]);
            update(1,1,n,pv,W[ord[pv]]);
        }

        ans=max(ans,st[1].best);
        i=j;
    }

    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...