Submission #776188

#TimeUsernameProblemLanguageResultExecution timeMemory
776188ttamxAliens (IOI16_aliens)C++14
100 / 100
109 ms9272 KiB
#include "aliens.h"
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;

const int N=1e5+5;
const int M=1e6+5;
const bool dbg=false;
const ll inf=1e18;

int n;
ll l[N],r[N];
ll overlap[N];
int mn[M];
stack<pair<int,int>> s;

bool querymode=false;

struct line{
    ll m,c;
    int cnt;
    line():m(0),c(-inf){}
    line(ll m,ll c,int cnt):m(m),c(c),cnt(cnt){}
    ll get(ll x){
        return m*x+c;
    }
};

bool bad(line l1,line l2,line l3){
    return (l3.c-l1.c)*(l1.m-l2.m)<=(l2.c-l1.c)*(l1.m-l3.m);
}

pair<ll,int> calc(ll lambda){
    ll dp=0;
    int cnt=0;
    deque<line> dq;
    dq.emplace_back(line(l[1],-l[1]*l[1],0));
    for(int i=1;i<=n;i++){
        ll x=2*(r[i]+1);
        while(dq.size()>1&&dq[0].get(x)<dq[1].get(x))dq.pop_front();
        dp=(r[i]+1)*(r[i]+1)+lambda-overlap[i]-dq[0].get(x);
        cnt=dq[0].cnt+1;
        if(i==n)break;
        line ln(l[i+1],-dp-l[i+1]*l[i+1],cnt);
        while(dq.size()>1&&bad(dq[dq.size()-2],dq.back(),ln))dq.pop_back();
        dq.emplace_back(ln);
    }
    return make_pair(dp,cnt);
}

long long take_photos(int N, int m, int k, vector<int> R, vector<int> C) {
    n=N;
    for(int i=0;i<m;i++)mn[i]=m;
    for(int i=0;i<n;i++){
        int x=R[i],y=C[i];
        int st=min(x,y),ed=max(x,y);
        mn[ed]=min(mn[ed],st);
    }
    for(int i=0;i<m;i++){
        if(mn[i]==m)continue;
        while(!s.empty()&&s.top().first>=mn[i])s.pop();
        s.emplace(mn[i],i);
    }
    n=s.size();
    for(int i=n;i>=1;i--){
        tie(l[i],r[i])=s.top();
        s.pop();
    }
    for(int i=1;i<n;i++){
        ll res=max(0ll,r[i]-l[i+1]+1);
        overlap[i]=res*res;
    }
    k=min(k,n);
    ll lo=0,hi=1ll*m*m+1;
    ll ans=1;
    while(lo<hi){
        ll mid=(lo+hi)/2;
        auto [val,cnt]=calc(mid);
        if(cnt<=k)hi=mid,ans=val-mid*k;
        else lo=mid+1;
    }
    return ans;
}

Compilation message (stderr)

aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:81:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   81 |         auto [val,cnt]=calc(mid);
      |              ^
#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...