Submission #1151988

#TimeUsernameProblemLanguageResultExecution timeMemory
1151988alexddAliens (IOI16_aliens)C++20
100 / 100
156 ms7916 KiB
#include "aliens.h"
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
pair<int,int> v[100005],newv[100005];
struct line
{
    int b,m;
    int eval(int x){ return m*x + b; }
};
double interx(line u, line v)
{
    return (double)(v.b - u.b)/(double)(u.m - v.m);
}
pair<int,int> calc(int n, int k, int coef)
{
    vector<pair<int,int>> dp(n+2,{INF,0});
    dp[0]={0,0};

    deque<pair<line,int>> hull;
    for(int i=1;i<=n;i++)
    {
        int u=i-1;
        line cur;
        if(v[u+1].second > v[u].first)
        {
            cur.b = dp[u].first + v[u+1].second*v[u+1].second + 1;
            cur.m = -2*v[u+1].second;
        }
        else
        {
            cur.b = dp[u].first + 2*v[u+1].second * (v[u].first+1) - v[u].first*(v[u].first+2);
            cur.m = -2*v[u+1].second;
        }
        while((int)hull.size()>1 && interx(hull.back().first,cur) <= interx(hull[(int)hull.size()-2].first,hull.back().first))
            hull.pop_back();
        hull.push_back({cur,dp[u].second});

        while((int)hull.size()>1 && hull[0].first.eval(v[i].first+1) >= hull[1].first.eval(v[i].first+1))
            hull.pop_front();

        dp[i].first = hull[0].first.eval(v[i].first+1) + v[i].first*(v[i].first+2) + coef;
        dp[i].second = hull[0].second + 1;
    }
    return dp[n];
}
long long take_photos(int32_t n, int32_t m, int32_t k, std::vector<int32_t> x, std::vector<int32_t> y)
{
    for(int i=0;i<n;i++)
    {
        if(x[i] < y[i])
            swap(x[i],y[i]);
        v[i+1] = {x[i],y[i]};
    }
    sort(v+1,v+1+n);

    int cv=INF,newn=0;
    for(int i=n;i>0;i--)
    {
        if(v[i].second < cv)
        {
            newv[++newn] = v[i];
            cv = v[i].second;
        }
    }
    reverse(newv+1,newv+1+newn);
    n = newn;
    for(int i=1;i<=n;i++)
        v[i] = newv[i];
    v[0] = {-1,-1};
    k = min(k, n);

    int st=0,dr=INF,ans=-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        pair<int,int> aux = calc(n,k,mij);
        if(aux.second >= k)
        {
            ans = mij;
            st = mij+1;
        }
        else
            dr = mij-1;
    }
    pair<int,int> aux = calc(n,k,ans);
    return aux.first - ans*k;
}

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...