답안 #1067028

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1067028 2024-08-20T09:53:38 Z steveonalex Building Bridges (CEOI17_building) C++17
100 / 100
104 ms 65876 KB
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
 
#define MASK(i) (1LL << (i))
#define GETBIT(mask, i) (((mask) >> (i)) & 1)
#define ALL(v) (v).begin(), (v).end()
#define block_of_code if(true)
 
ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
ll gcd(ll a, ll b){return __gcd(a, b);}
ll lcm(ll a, ll b){return a / gcd(a, b) * b;}
 
ll LASTBIT(ll mask){return (mask) & (-mask);}
int pop_cnt(ll mask){return __builtin_popcountll(mask);}
int ctz(ull mask){return __builtin_ctzll(mask);}
int logOf(ull mask){return 63 - __builtin_clzll(mask);}
 
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);}
double rngesus_d(double l, double r){
    double cur = rngesus(0, MASK(60) - 1);
    cur /= MASK(60) - 1;
    return l + cur * (r - l);
}
 
template <class T1, class T2>
    bool maximize(T1 &a, T2 b){
        if (a < b) {a = b; return true;}
        return false;
    }
 
template <class T1, class T2>
    bool minimize(T1 &a, T2 b){
        if (a > b) {a = b; return true;}
        return false;
    }
 
template <class T>
    void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){
        for(auto item: container) out << item << separator;
        out << finish;
    }
 
template <class T>
    void remove_dup(vector<T> &a){
        sort(ALL(a));
        a.resize(unique(ALL(a)) - a.begin());
    }


const ll INF = 1e18 + 69;

struct SegmentTree{
    int n;
    vector<pair<int, ll>> a;

    SegmentTree(int _n){
        n = _n;
        a.resize(n * 4 + 4, {0, INF});
    }

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

    ll f(int x, pair<int, ll> sigma){
        return sqr(sigma.first - x) + sigma.second;
    }

    ll get(int i){
        int id = 1, l = 0, r = n;
        ll ans = INF;
        while(l < r){
            minimize(ans, f(i, a[id]));
            int mid = (l + r) >> 1;
            if (i <= mid) {
                r = mid;
                id = id * 2;
            }
            else{
                l = mid + 1;
                id = id * 2 + 1;
            }
        }
        minimize(ans, f(i, a[id]));
        return ans;
    }

    void update(int u, int v, pair<int, ll> slope, int l, int r, int id){
        int mid = (l + r) >> 1;
        if (u <= l && r <= v){
            if (f(l, slope) >= f(l, a[id]) && f(r,slope) >= f(r, a[id])) return;
            if (f(l, slope) <= f(l, a[id]) && f(r,slope) <= f(r, a[id])) {
                a[id] = slope;
                return;
            }
            else{
                update(u, v, slope, l, mid, id * 2);
                update(u, v, slope, mid + 1, r, id * 2 + 1);
            }
            return;
        }
        if (u <= mid) update(u, v, slope, l, mid, id * 2);
        if (v > mid) update(u, v, slope, mid + 1, r, id * 2 + 1);
    }

    void update(int u, int v, pair<int, ll> slope){
        update(u, v, slope, 0, n, 1);
    }
};

int main(void){
    ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);
    clock_t start = clock();

    int n; cin >> n;
    vector<int> a(n+1), w(n+1);
    for(int i = 1; i<=n; ++i) cin >> a[i];
    for(int i = 1; i<=n; ++i) cin >> w[i];

    ll sum = 0;
    for(int i: w) sum += i;

    SegmentTree st(1e6); st.update(0, 1e6, {a[1], -w[1]});
    vector<ll> dp(n+1); dp[1] = w[1];
    for(int i = 2; i<=n; ++i){
        dp[i] = st.get(a[i]) - w[i];
        st.update(0, i, {a[i], dp[i]});
        st.update(i, 1e6, {a[i], dp[i]});
    }
    cout << dp[n] + sum << "\n";

    cerr << "Time elapsed: " << clock() - start << " ms\n";
    return 0;
}

// ac#aa
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 62936 KB Output is correct
2 Correct 22 ms 62912 KB Output is correct
3 Correct 23 ms 62952 KB Output is correct
4 Correct 26 ms 63096 KB Output is correct
5 Correct 27 ms 62900 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 65668 KB Output is correct
2 Correct 89 ms 65616 KB Output is correct
3 Correct 88 ms 65668 KB Output is correct
4 Correct 84 ms 65440 KB Output is correct
5 Correct 78 ms 65488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 62936 KB Output is correct
2 Correct 22 ms 62912 KB Output is correct
3 Correct 23 ms 62952 KB Output is correct
4 Correct 26 ms 63096 KB Output is correct
5 Correct 27 ms 62900 KB Output is correct
6 Correct 90 ms 65668 KB Output is correct
7 Correct 89 ms 65616 KB Output is correct
8 Correct 88 ms 65668 KB Output is correct
9 Correct 84 ms 65440 KB Output is correct
10 Correct 78 ms 65488 KB Output is correct
11 Correct 99 ms 65876 KB Output is correct
12 Correct 104 ms 65620 KB Output is correct
13 Correct 80 ms 65760 KB Output is correct
14 Correct 95 ms 65816 KB Output is correct
15 Correct 95 ms 65380 KB Output is correct
16 Correct 79 ms 65580 KB Output is correct
17 Correct 73 ms 65624 KB Output is correct
18 Correct 76 ms 65608 KB Output is correct