Submission #75559365


Source Code Expand

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

#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

mt19937_64 rng(std::chrono::system_clock::now().time_since_epoch().count());

template<class T>
struct RMQ {
    vector<vector<T>> jmp;
    RMQ(const vector<T>& V) : jmp(1, V) {
        for (int pw = 1, k = 1; pw * 2 <= sz(V); pw *= 2, ++k) {
            jmp.emplace_back(sz(V) - pw * 2 + 1);
            rep(j,0,sz(jmp[k]))
                jmp[k][j] = min(jmp[k - 1][j], jmp[k - 1][j + pw]);
        }
    }
    T query(int a, int b) {
        assert(a < b); // or return inf if a == b
        int dep = 31 - __builtin_clz(b - a);
        return min(jmp[dep][a], jmp[dep][b - (1 << dep)]);
    }
};

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t;
    cin >> t;
    while(t--){
        int n;
        cin >> n;
        vector<int>p(n+1);
        vector<int>a(n+1);
        vector<pii>arr(n+1);
        for(int i = 1; i<=n; i++){
            cin >> p[i];
            arr[i] = {p[i],i};
        }
        RMQ rmq(arr);
        for(int i = 1; i<=n; i++){
            cin >> a[i];
        }
        auto merge1 = [&](vi a, int v) -> vi {
            int n = sz(a);
            vi b(n+1,(int)1e18);
            for(int i = 0; i<n; i++){
                b[i] = min(b[i],a[i]);
                b[i+1] = min(b[i+1],a[i] + v);
            }
            return b;
        };
        auto merge = [&](vi a, vi b, int v) -> vi {
            if(a.empty() && b.empty()) return {0,v};
            if(b.empty())return merge1(a,v);
            if(a.empty())return merge1(b,v);
            int n = sz(a); int m = sz(b);
            vi c(n+m,(int)1e18);
            for(int i = 0; i<n; i++){
                for(int j = 0; j<m; j++){
                    bool both = (i > 0 && j > 0);
                    c[i+j +both] = min(c[i+j+both],a[i] + b[j] + v * both);
                    c[i+j+1] = min(c[i+j+1], a[i] + b[j] + v);
                }
            }
            return c;
        };
        auto self = [&](auto &&self, int l, int r) -> vi {
            if(r <= l){
                return {};
            }
            auto [_,m] = rmq.query(l,r);
            vi left = self(self,l,m);
            vi right = self(self,m+1,r);
            return merge(left,right,a[m]);
        };
        vi res = self(self,1,n+1);
        for(int i = 1; i<=n; i++){
            cout << res[i] << " \n"[i==n];
        }
    }
    return 0;
}

Submission Info

Submission Time
Task F - Set
User kevinyang
Language C++23 (GCC 15.2.0)
Score 4
Code Size 2665 Byte
Status AC
Exec Time 17 ms
Memory 4900 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 4 / 4
Status
AC × 1
AC × 11
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3492 KiB
01_random_00.txt AC 2 ms 3508 KiB
01_random_01.txt AC 2 ms 3648 KiB
01_random_02.txt AC 2 ms 3460 KiB
01_random_03.txt AC 2 ms 3612 KiB
01_random_04.txt AC 2 ms 3624 KiB
01_random_05.txt AC 2 ms 3624 KiB
01_random_06.txt AC 5 ms 3904 KiB
01_random_07.txt AC 16 ms 4900 KiB
01_random_08.txt AC 16 ms 4800 KiB
01_random_09.txt AC 17 ms 4776 KiB