제출 #170062

#제출 시각아이디문제언어결과실행 시간메모리
170062osaaateiasavtnlAliens (IOI16_aliens)C++14
100 / 100
358 ms12020 KiB
#include<bits/stdc++.h>
#ifdef HOME
#else
#include "aliens.h"
#endif
using namespace std;
#define int long long
#define ii pair <int, int>
#define app push_back
#define all(a) a.begin(), a.end()
#define bp __builtin_popcount
#define ll long long
#define mp make_pair
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define Time (double)clock()/CLOCKS_PER_SEC
bool comp(ii a, ii b) {
    return a.f < b.f || (a.f == b.f && a.s > b.s);
}   
const int N = 1e5 + 7, INF = 1e18 + 7, C = 1e12;

struct Line {
    int a, b, k;
};  
ii get(Line l, int x) {
    return mp(l.a + l.b * x, l.k);
}   
int get_better(Line a, Line b) {
    if (a.a >= b.a)
        return -INF;
    int d = a.b - b.b;
    return (b.a - a.a + d - (a.k >= b.k)) / d;
}   
struct Cht {
    vector <Line> a;
    int ptr;
    void clear() {
        a.clear();
        ptr = 0;                    
    }
    void add(ii l, int k) {
        Line add = {l.f, l.s, k};
        while (a.size() >= 2 && get_better(add, a.back()) <= get_better(a.back(), a[a.size() - 2]))
            a.pop_back();
        while (a.size() && add.a >= a.back().a)
            a.pop_back();
        a.app(add);
    }   
    ii get_cht(int x) {
        if (ptr == a.size())
            return mp(-INF, -INF);
        while (ptr + 1 < a.size() && get(a[ptr + 1], x) > get(a[ptr], x))
            ++ptr;
        return get(a[ptr], x);
    }   
} mem;  

ii dp[N];
ii solve(int n, int sh, vector <ii> &a) {
    dp[0] = mp(0, 0);
    mem.clear();
    for (int i = 1; i <= n; ++i) {        
        if (i == 1 || a[i - 2].s < a[i - 1].f) {
            mem.add(mp(-dp[i - 1].f - a[i - 1].f * a[i - 1].f, 2 * a[i - 1].f), -dp[i - 1].s);  
        }
        else {
            int in = a[i - 2].s - a[i - 1].f + 1;
            mem.add(mp(-dp[i - 1].f - a[i - 1].f * a[i - 1].f + in * in, 2 * a[i - 1].f), -dp[i - 1].s);  
        }   
        dp[i] = mem.get_cht(a[i - 1].s + 1);
        dp[i].f *= -1; dp[i].s *= -1; 
        dp[i].f += (a[i - 1].s + 1) * (a[i - 1].s + 1) + sh;
        dp[i].s += 1;
        /*
        for (int l = 0; l < i; ++l) {
            int tl = a[l].f, tr = a[i - 1].s;
            int len = tr - tl + 1;
            if (l && a[l - 1].s >= tl) {
                int in = a[l - 1].s - tl + 1;
                dp[i] = min(dp[i], mp(dp[l].f + len * len - in * in + sh, dp[l].s + 1));
            }
        }
        */
    }   
    return dp[n];
}   
long long take_photos(signed n, signed m, signed k, vector<signed> rr, vector<signed> cc) {
    vector <ii> a;
    for (int i = 0; i < n; ++i) {
        if (cc[i] < rr[i])
            swap(rr[i], cc[i]);
        a.app(mp(rr[i], cc[i]));
    }
    sort(all(a), comp);
    vector <ii> b;
    int r = -1;
    for (auto e : a) {
        if (e.s <= r) 
            continue;
        b.app(e);
        r = e.s;
    }   
    a = b;
    n = a.size();

    if (k >= n)
        return solve(n, 0, a).f;

    int l = -C;
    r = C;
    while (l < r - 1) {
        int mid = (l + r) / 2;
        if (solve(n, mid, a).s <= k)
            r = mid;
        else
            l = mid;
    }
    auto t = solve(n, r, a);
    return t.f - k * r;
}            

컴파일 시 표준 에러 (stderr) 메시지

aliens.cpp: In member function 'std::pair<long long int, long long int> Cht::get_cht(long long int)':
aliens.cpp:52:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if (ptr == a.size())
             ~~~~^~~~~~~~~~~
aliens.cpp:54:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (ptr + 1 < a.size() && get(a[ptr + 1], x) > get(a[ptr], x))
                ~~~~~~~~^~~~~~~~~~
#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...