제출 #1208829

#제출 시각아이디문제언어결과실행 시간메모리
1208829sula2나일강 (IOI24_nile)C++20
67 / 100
2089 ms8744 KiB
#include <bits/stdc++.h>
#define all(a) a.begin(), a.end()
#define popcount(x) __builtin_popcountll(x)
using namespace std;
using namespace chrono;

struct segtree {
    vector<long long> tree;
    int offset = 1;

    segtree(int n) {
        while (offset < n) offset <<= 1;
        tree.resize(offset << 1);
    }

    void update(int i, long long x) {
        tree[i += offset] = x;
        while (i >>= 1) tree[i] = min(tree[i*2], tree[i*2 + 1]);
    }

    long long query(int v, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) return tree[v];
        if (qr < l || r < ql) return 1e18;
        int mid = l+r >> 1;
        return min(query(2*v, l, mid, ql, qr),
            query(2*v+1, mid+1, r, ql, qr));
    }

    long long query(int l, int r) { return query(1, 0, offset - 1, l, r); }
};

long long solve(vector<int> W, vector<int> A,
                vector<int> B, int D) {
    int n = W.size();
    vector<int> ind(n);
    iota(all(ind), 0);
    sort(all(ind), [&](int i, int j) { return W[i] < W[j]; });
    vector<long long> dp(n);
    segtree s(n);
    dp[0] = A[ind[0]];
    long long sum = A[ind[0]];
    int j = 0;
    s.update(0, -A[ind[0]] + B[ind[0]]);
    for (int i = 1; i < n; i++) {
        while (W[ind[i]] - W[ind[j]] > D)
            j++;
        dp[i] = dp[i-1] + A[ind[i]];
        if (j < i) {
            dp[i] = min(dp[i], sum + s.query(j, i-1) + B[ind[i]]);
        }
        sum += A[ind[i]];
        s.update(i, -sum + dp[i-1] + B[ind[i]]);
    }
    return dp[n-1];
}

vector<long long> calculate_costs(
        vector<int> W, vector<int> A,
        vector<int> B, vector<int> E
        ) {
    int n = W.size(), q = E.size();
    vector<long long> res(q);
    for (int i = 0; i < q; i++) {
        res[i] = solve(W, A, B, E[i]);
    }
    return res;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...