제출 #1369858

#제출 시각아이디문제언어결과실행 시간메모리
1369858moha1111Nile (IOI24_nile)C++20
67 / 100
2095 ms10276 KiB
//#include "nile.h"
#include "bits/stdc++.h"
using namespace std;

std::vector<long long> calculate_costs(std::vector<int> w, std::vector<int> a , std::vector<int> b, std::vector<int> E) {
  
    long long n = a.size() , q = E.size() , sum = accumulate(a.begin() , a.end() , 0LL);
    vector<int> dif(n + 5);
    vector<pair<int , int>> W;
    for(int i = 0 ; i < n ; i++)
        W.push_back({w[i] , i});

    sort(W.begin() , W.end());
    sort(w.begin() , w.end());
    for(int i = 1 ; i <= n ; i++)
        dif[i] = a[W[i - 1].second] - b[W[i - 1].second];
    
    vector<long long> ans(q);
    vector<pair<int , int>> e;
    for(int i = 0 ; i < q ; i++)
        e.push_back({E[i] , i});

    sort(e.begin() , e.end());
    multiset<long long> mx;
    vector<long long> dp(n + 5 , 0);
    while(q--)
    {
        long long d = e.back().first , ine = e.back().second;
        e.pop_back();
        vector<long long> dp(n + 5 , 0);
        multiset<long long> mx;
        int l = 1;

        for(int i = 1 ; i <= n ; i++)
        {
            if(i > 1)
                mx.insert(dp[i - 2] + dif[i - 1]);

            while(l < i && w[i - 1] - w[l - 1] > d)
            {
                mx.erase(mx.find(dp[l - 1] + dif[l]));
                l++;
            }
            dp[i] = dp[i - 1];
            if(mx.size())
                dp[i] = max(dp[i] , dif[i] + *mx.rbegin());
        }
        ans[ine] = sum - dp[n];
    }
    return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…