Submission #402654

#TimeUsernameProblemLanguageResultExecution timeMemory
402654danielcm585Aliens (IOI16_aliens)C++14
0 / 100
1 ms204 KiB
#include "aliens.h"

#include <bits/stdc++.h>
using namespace std;

#define r first
#define c second

typedef long long ll;
typedef pair<int,int> ii;

const int N = 1e5;
const ll INF = 1e18;
ll dp[N+2];
vector<ii> p;

struct line {
    ll m, c;

    line(ll x, ll y): m(x), c(y) {}

    ll operator () (ll x) {
        return m*x+c;
    }
};

struct convexHull {
    vector<line> v;

    bool greater(ll a, ll b, ll c, ll d) {
        if (a/b != c/d) return a/b > c/d;
        return (a%b)*d >= (c%d)*b;
    }

    bool bad(line a, line b, line c) {
        return greater(b.c-a.c,a.m-b.m,c.c-b.c,b.m-c.m);
    }

    void insert(line x) {
        int sz = v.size();
        while (sz >= 2 && bad(v[sz-2],v[sz-1],x)) {
            v.pop_back(); sz--;
        }
        v.push_back(x);
    }

    ll query(ll x) {
        ll ret = INF;
        for (int l = 0, r = v.size()-1; l <= r; ) {
            int mid = (l+r)/2;
            ret = min(ret,v[mid](x));
            if (mid+1 <= r && v[mid+1](x) < v[mid](x)) l = mid+1;
            else r = mid-1;
        }
        return ret;
    }
};

ll sqr(ll a) {
    return a*a;
}

ll take_photos(int n, int m, int k, vector<int> r, vector<int> c) {
    vector<ii> tmp;
    for (int i = 0; i < n; i++) {
        if (r[i] > c[i]) swap(r[i],c[i]);
        tmp.push_back(ii(r[i],c[i]));
    }
    sort(tmp.begin(),tmp.end());
    p.push_back(ii(-1,-1));
    for (auto i : tmp) {
        while (!p.empty() && p.back().r == i.r) p.pop_back();
        p.push_back(i);
    }
    n = p.size()-1;
    convexHull ch;
    for (int i = 1; i <= n; i++) {
        ch.insert(line(-2*(p[i].r-1),dp[i-1]+sqr(p[i].r-1)));
        dp[i] = ch.query(p[i].c)+sqr(p[i].c);
        // cout << dp[i] << ' ';
    }
    // cout << '\n';
    return dp[n];
}

/*
5 7 2
0 3
4 4
4 6
4 5
4 6

2 6 2
1 4
4 1
*/
#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...