Submission #1275284

#TimeUsernameProblemLanguageResultExecution timeMemory
1275284coderg300711Aliens (IOI16_aliens)C++20
100 / 100
318 ms4440 KiB
#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;
using ll=long long;

#define all(x) (x).begin(), (x).end()
#define REP(i,l,r) for(int i=(l);i<(r);i++)
#define sz(x) int(x.size())

ll pow2(ll v){return v*v;}

struct Line {
    ll a, b;
    ll eval(ll x){return a*x+b;}
};

struct CHT {
    deque<Line> deq;
    void add(Line line) {
        if (!deq.empty() && deq.front().a==line.a) {
            if (deq.front().b < line.b)return;
            else deq.pop_front();
        }
        while (sz(deq)>=2) {
            if (__int128_t(deq[0].a-line.a)*__int128_t(deq[1].b-deq[0].b)<=
                __int128_t(deq[0].b-line.b)*__int128_t(deq[1].a-deq[0].a)) {
                deq.pop_front();
            } else break;
        }
        deq.push_front(line);
    }

    ll query(ll x) {
        while (sz(deq)>=2){
            if (deq[sz(deq)-1].eval(x)>=deq[sz(deq)-2].eval(x)){
                deq.pop_back();
            } else break;
        }
        return deq.back().eval(x);
        ll mn=1LL<<60;
        for (auto &line:deq)
            mn=min(mn,line.eval(x));
        return mn;
    }
};

long long take_photos(int n, int m, int K, vector<int> r,vector<int> c) {
    vector<pair<int, int>> pts(n);
    for(int i=0;i<n;i++){
        if (r[i]>c[i])swap(r[i],c[i]);
        pts[i]=make_pair(r[i],c[i]);
    }
    sort(all(pts));
    {
        vector<pair<int,int>> pts2;
        for(int i=0;i<n;i++){
            if (i!=n-1 && pts[i].first==pts[i+1].first)continue;
            pts2.push_back(pts[i]);
        }
        pts=pts2;
        n=sz(pts);
    }
    {
        vector<pair<int,int>> pts2;
        int mx_c= -1;
        for(int i=0;i<n;i++){
            if (pts[i].second<=mx_c)continue;
            pts2.push_back(pts[i]);
            mx_c=max(mx_c, pts[i].second);
        }
        pts=pts2;
        n=sz(pts);
    }

    auto relax=[&](ll lambda) {
        vector<ll> dp(n+1,1LL<<60);
        dp[0]=0;
        CHT cht;
        for(int i=0;i<=n;i++){
            if(i!=0) {
                ll x=pts[i-1].second;
                ll mn=cht.query(x);
                ll res=mn+x*x+lambda;
                dp[i]=res;
            }
            if(i==n)continue;
            ll a=2*(-pts[i].first+1);
            ll diff=pow2(max(0LL,i==0?0LL:(pts[i-1].second-pts[i].first+1)));
            ll b=dp[i]+pow2(-pts[i].first+1)-diff;
            cht.add({a, b});
        }
        return dp[n]-lambda*K;
    };
    ll lo=0,hi=1LL<<40;
    while(hi-lo>3) {
        ll m1=(2*lo+hi)/3;
        ll m2=(lo+2*hi)/3;
        if(relax(m1)>relax(m2))hi=m2-1;
        else lo=m1+1;
    }
    cerr<<hi<<' '<<lo<<'\n';
    ll ans= -1;
    for (ll lambda=lo;lambda<=hi;lambda++)ans=max(ans,relax(lambda));

    return ans;
}

Compilation message (stderr)

aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...