Submission #1199264

#TimeUsernameProblemLanguageResultExecution timeMemory
1199264alexander707070Bulldozer (JOI17_bulldozer)C++20
0 / 100
0 ms324 KiB
#include<bits/stdc++.h>
#define pi M_PI
#define MAXN 2007
using namespace std;

const long double eps=0.0000001;

struct point{
    long double x,y;
    int cost;

    inline friend bool operator < (point fr,point sc){
        if(fr.x!=sc.x)return fr.y<sc.y;
        return fr.x<sc.x;
    }

}p[MAXN],t[MAXN];

int n,m;
long long a[MAXN],ans;

void solve_ver(){
    sort(t+1,t+n+1);
    
    m=0;
    for(int i=1;i<=n;i++){
        if(i>1 and fabs(t[i].x-t[i-1].x)<eps){
            a[m]+=t[i].cost;
        }else{
            m++; a[m]=t[i].cost;
        }
    }

    long long sum=0;
    for(int i=1;i<=m;i++){
        sum+=a[i];
        if(sum<0)sum=0;
        ans=max(ans,sum);
    }
}

int k;
long double angles[MAXN*MAXN];

void lines(point s){
    for(int i=1;i<=n;i++){
        p[i].x-=s.x; p[i].y-=s.y;
    }

    for(int i=1;i<=n;i++){
        if(p[i].x==0 and p[i].y==0)continue;

        double angle=pi/2 - atan2(p[i].y,p[i].x);
        angles[++k]=angle;
    }

    for(int i=1;i<=n;i++){
        p[i].x+=s.x; p[i].y+=s.y;
    }
}

long double nxt(long double x){
    int l=0,r=k+1,tt;
    while(l+1<r){
        tt=(l+r)/2;
        if(angles[tt]>x){
            r=tt;
        }else{
            l=tt;
        }
    }

    if(r==k+1)return x + (2*pi-(x-angles[1]))/2.0;
    return (angles[r]+angles[r-1])/2.0;
}

long double pr(long double x){
    int l=0,r=k+1,tt;
    while(l+1<r){
        tt=(l+r)/2;
        if(angles[tt]<x){
            l=tt;
        }else{
            r=tt;
        }
    }

    if(l==0)return x - (2*pi-(angles[k]-x))/2.0;
    return (angles[l]+angles[l+1])/2.0;
}

void solve(point s){
    for(int i=1;i<=n;i++){
        p[i].x-=s.x; p[i].y-=s.y;
    }

    for(int i=1;i<=n;i++){
        if(p[i].x==0 and p[i].y==0)continue;

        double angle=pi/2 - atan2(p[i].y,p[i].x),curr=angle;

        for(int f=1;f<=n;f++){
            t[f]={p[f].x*cos(angle) + p[f].y*sin(angle) , -p[f].x*sin(angle) + p[f].y*cos(angle),p[f].cost};
        }
        solve_ver();

        angle=nxt(curr);

        for(int f=1;f<=n;f++){
            t[f]={p[f].x*cos(angle) + p[f].y*sin(angle) , -p[f].x*sin(angle) + p[f].y*cos(angle),p[f].cost};
        }
        solve_ver();

        angle=pr(curr);

        for(int f=1;f<=n;f++){
            t[f]={p[f].x*cos(angle) + p[f].y*sin(angle) , -p[f].x*sin(angle) + p[f].y*cos(angle),p[f].cost};
        }
        solve_ver();
    }

    for(int i=1;i<=n;i++){
        p[i].x+=s.x; p[i].y+=s.y;
    }
}

int main(){

    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>p[i].x>>p[i].y>>p[i].cost;
    }

    //for(int i=1;i<=n;i++)lines(p[i]);
    //sort(angles+1,angles+k+1);

    for(long double angle=0;angle<pi;angle+=2*pi){
        for(int f=1;f<=n;f++){
            t[f]={p[f].x*cos(angle) + p[f].y*sin(angle) , -p[f].x*sin(angle) + p[f].y*cos(angle),p[f].cost};
        }
        solve_ver();
    }

    /*for(int i=1;i<=n;i++){
        solve(p[i]);
    }*/

    cout<<ans<<"\n";

    return 0;
}
#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...