제출 #1357212

#제출 시각아이디문제언어결과실행 시간메모리
1357212AvianshAliens (IOI16_aliens)C++20
100 / 100
121 ms9016 KiB
#include <bits/stdc++.h>

#include "aliens.h"

using namespace std;

const long long inf = 2e18;

long long div2(long long a, long long b){
    return (a/b)-((a%b)&&(a^b)<0);
}

long long inter(array<long long,3>a, array<long long,3> b){
    return div2(a[1]-b[1],b[0]-a[0]);
}

pair<long long, int> check(vector<array<long long,2>> &rangs, long long lam){
    pair<long long,int>dp = {0,0};
    vector<array<long long,3>>cht;
    ///stores: {m,c,num} (num not used for sorting it just there for reasons)
    cht.push_back({-2*rangs[0][0],rangs[0][0]*rangs[0][0]-2*rangs[0][0]});
    int chtind = 0;
    for(int i = 0;i<rangs.size();i++){
        long long l = rangs[i][0];
        long long r = rangs[i][1];
        while(chtind<cht.size()-1&&r>inter(cht[chtind],cht[chtind+1])){
            chtind++;
        }
        dp={cht[chtind][0]*r+cht[chtind][1]+r*r+2*r+1+lam,cht[chtind][2]+1};
        if(i<rangs.size()-1){
            array<long long,3>curr = {-2*rangs[i+1][0],dp.first+rangs[i+1][0]*rangs[i+1][0]-2*rangs[i+1][0]-max(0LL,r-rangs[i+1][0]+1)*max(0LL,r-rangs[i+1][0]+1),dp.second};
            while(cht.size()>1&&inter(cht[cht.size()-1],cht[cht.size()-2])>=inter(cht.back(),curr)){
                cht.pop_back();
            }
            cht.push_back(curr);
            chtind=min(chtind,(int)cht.size()-1);
        }
    }
    return dp;
}

vector<array<long long,2>>pre(vector<array<long long,2>> &arr){
    vector<array<long long,2>>ans;
    sort(arr.begin(),arr.end());
    ans.push_back(arr[0]);
    for(int i = 1;i<arr.size();i++){
        if(arr[i][0]==ans.back()[0]){
            ans.back()[1]=arr[i][1];
        }
        else{
            if(arr[i][1]>ans.back()[1]){
                ans.push_back(arr[i]);
            }
        }
    }
    return ans;
}

long long take_photos(int n, int m, int k, vector<int> r, vector<int> c) {
    vector<array<long long,2>> rangs(n);
    for(int i = 0;i<n;i++){
        rangs[i]={min(r[i],c[i]),max(r[i],c[i])};
    }
    rangs = pre(rangs);
    n=rangs.size();
    k=min(k,n);
    long long  lo = 0;
    long long hi = 2e12;
    while(lo<hi){
        long long mid = (lo+hi)/2;
        pair<long long,int> p = check(rangs,mid);
        if(p.second>k){
            lo=mid+1;
        }
        else{
            hi=mid;
        }
    }
    pair<long long,int> p = check(rangs,lo);
    return p.first-k*lo;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…