Submission #298444

#TimeUsernameProblemLanguageResultExecution timeMemory
298444zoooma13Aliens (IOI16_aliens)C++14
60 / 100
2049 ms7020 KiB
#include "bits/stdc++.h"
#include "aliens.h"
using namespace std;

struct line{
    long long m ,c;
    long long eva(long long x) { return m * x + c; }
    long double intersectX(line l) { return (long double)(c - l.c)/(l.m - m); }
};
struct hull:deque<line>{
    void add(long long m ,long long b){
        line cur{m ,b};
        while(size() >= 2 && cur.intersectX(front()) <= front().intersectX(at(1)))
            pop_front();
        push_front({m ,b});
    }
    long long eval(long long x){
        while(size() >= 2 && back().eva(x) >= at(size()-2).eva(x))
            pop_back();
        return back().eva(x);
    }
};

long long sqr(long long num){
    return num*num;
}

long long take_photos(int n, int m, int k, vector<int> r, vector<int> c) {
    vector <pair<int ,int>> rngs ,po;
    for(int i=0; i<n; i++){
        if(r[i] < c[i])
            swap(r[i] ,c[i]);
        rngs.push_back({c[i] ,-r[i]});
    }
    sort(rngs.begin() ,rngs.end());
    int mx = -1;
    for(auto&r : rngs) if(-r.second > mx){
        po.push_back({r.first ,-r.second+1});
        mx = -r.second;
    }
    po.insert(po.begin() ,make_pair(-1 ,0));

    n = po.size();
    vector <long long> dp(n ,1e18) ,exdp(n ,1e18);
    dp[0] = 0 ,exdp[0] = 0;
    while(k--){
        swap(dp ,exdp);
        hull h;
        for(int i=1; i<n; i++){
            h.add(-2*po[i].first ,exdp[i-1] + sqr(po[i].first) - sqr(max(0 ,po[i-1].second-po[i].first)));
            dp[i] = sqr(po[i].second) + h.eval(po[i].second);
            ///for(int j=0; j<i; j++)
               /// dp[i] = min(dp[i] ,exdp[j] + sqr(po[i].second-po[j+1].first+1) - sqr(max(0 ,po[j].second-po[j+1].first+1)));
        }
    }

    return dp.back();
}
#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...