답안 #402789

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
402789 2021-05-12T11:09:19 Z danielcm585 Aliens (IOI16_aliens) C++14
12 / 100
1 ms 332 KB
#include "aliens.h"
 
#include <bits/stdc++.h>
using namespace std;
 
#define fi first
#define se second
 
typedef long long ll;
typedef pair<ll,ll> ii;
 
const int N = 1e5;
const ll INF = 1e18;
int sz;
ll dp[N+2], bt[N+2];
vector<int> r, c;
 
struct line {
    ll m, c;
 
    line(ll x, ll y): m(x), c(y) {}
 
    bool operator == (line v) {
        return m == v.m && c == v.c;
    }
 
    ll operator () (ll x) {
        return m*x+c;
    }
};
 
struct convexHull {
    vector<line> v;
    vector<int> id;
 
    convexHull() {
        v.clear(); id.clear();
    }
 
    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, int x, int y) {
        if (b == c) return bt[x] > bt[y];
        return greater(b.c-a.c,a.m-b.m,c.c-b.c,b.m-c.m);
    }
 
    void insert(line x, int y) {
        int sz = v.size();
        while (sz >= 2 && bad(v[sz-2],v[sz-1],x,id[sz-1],y)) {
            v.pop_back(); sz--;
            id.pop_back();
        }
        v.push_back(x);
        id.push_back(y);
    }
 
    ii query(ll x) {
        ii ret = ii(INF,INF);
        for (int l = 0, r = v.size()-1; l <= r; ) {
            int mid = (l+r)/2;
            if (v[mid](x) < ret.fi || v[mid](x) == ret.fi && bt[id[mid]] < ret.se) ret = ii(v[mid](x),bt[id[mid]]);
            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;
}
 
int monge(ll mid) {
    convexHull ch;
    for (int i = 1; i <= sz; i++) {
        ch.insert(line(-2*(r[i]-1),dp[i-1]+sqr(r[i]-1)),i-1);
        ii opt = ch.query(c[i]);
        dp[i] = opt.fi+sqr(c[i])+mid;
        bt[i] = opt.se+1;
        // cout << dp[i] << ' ';
    }
    // cout << '\n';
    return bt[sz];
}
 
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());
    r.push_back(-1); c.push_back(-1);
    for (auto i : tmp) {
        while (r.back() == i.fi) {
            r.pop_back(); c.pop_back();
        }
        if (c.back() != i.se) {
            r.push_back(i.fi); c.push_back(i.se);
        }
    }
    sz = r.size()-1;
    ll ans = -1;
    for (ll l = 0, r = (ll)m*m; l <= r; ) {
        ll mid = (l+r)/2;
        if (monge(mid) <= k) {
            ans = dp[sz]-mid*k;
            r = mid-1;
        }
        else l = mid+1;
    }
    return ans;
}
 
/*
5 7 2
0 3
4 4
4 6
4 5
4 6
 
2 6 2
1 4
4 1
*/

Compilation message

aliens.cpp: In member function 'ii convexHull::query(ll)':
aliens.cpp:64:59: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   64 |             if (v[mid](x) < ret.fi || v[mid](x) == ret.fi && bt[id[mid]] < ret.se) ret = ii(v[mid](x),bt[id[mid]]);
      |                                                           ^
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Correct answer: answer = 4
2 Correct 1 ms 204 KB Correct answer: answer = 4
3 Correct 1 ms 204 KB Correct answer: answer = 4
4 Incorrect 1 ms 204 KB Wrong answer: output = 8, expected = 12
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Correct answer: answer = 1
2 Correct 1 ms 204 KB Correct answer: answer = 4
3 Correct 1 ms 204 KB Correct answer: answer = 1
4 Correct 1 ms 204 KB Correct answer: answer = 5
5 Correct 1 ms 204 KB Correct answer: answer = 41
6 Correct 1 ms 204 KB Correct answer: answer = 71923
7 Correct 1 ms 204 KB Correct answer: answer = 77137
8 Correct 1 ms 332 KB Correct answer: answer = 764
9 Correct 1 ms 332 KB Correct answer: answer = 250000
10 Correct 1 ms 332 KB Correct answer: answer = 500
11 Correct 1 ms 204 KB Correct answer: answer = 32
12 Correct 1 ms 332 KB Correct answer: answer = 130050
13 Correct 1 ms 332 KB Correct answer: answer = 5110
14 Correct 1 ms 332 KB Correct answer: answer = 2626
15 Correct 1 ms 204 KB Correct answer: answer = 796
16 Correct 1 ms 332 KB Correct answer: answer = 7580
17 Correct 1 ms 332 KB Correct answer: answer = 1904
18 Correct 1 ms 300 KB Correct answer: answer = 996004
19 Correct 1 ms 204 KB Correct answer: answer = 38817
20 Correct 1 ms 332 KB Correct answer: answer = 4096
21 Correct 1 ms 292 KB Correct answer: answer = 1
22 Correct 1 ms 204 KB Correct answer: answer = 1
23 Correct 1 ms 332 KB Correct answer: answer = 2040
24 Correct 1 ms 204 KB Correct answer: answer = 2
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Correct answer: answer = 4
2 Correct 1 ms 204 KB Correct answer: answer = 4
3 Correct 1 ms 204 KB Correct answer: answer = 4
4 Incorrect 1 ms 204 KB Wrong answer: output = 8, expected = 12
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Correct answer: answer = 4
2 Correct 1 ms 204 KB Correct answer: answer = 4
3 Correct 1 ms 204 KB Correct answer: answer = 4
4 Incorrect 1 ms 204 KB Wrong answer: output = 8, expected = 12
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Correct answer: answer = 4
2 Correct 1 ms 204 KB Correct answer: answer = 4
3 Correct 1 ms 204 KB Correct answer: answer = 4
4 Incorrect 1 ms 204 KB Wrong answer: output = 8, expected = 12
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Correct answer: answer = 4
2 Correct 1 ms 204 KB Correct answer: answer = 4
3 Correct 1 ms 204 KB Correct answer: answer = 4
4 Incorrect 1 ms 204 KB Wrong answer: output = 8, expected = 12
5 Halted 0 ms 0 KB -