제출 #1210456

#제출 시각아이디문제언어결과실행 시간메모리
1210456PagodePaiva나일강 (IOI24_nile)C++20
67 / 100
2092 ms10148 KiB
#include "nile.h"
#include<bits/stdc++.h>
#define c custo

using namespace std;

const int N = 200010;
long long dp[N];
long long custo[N];
long long w[N];

vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A,
                                       std::vector<int> B, std::vector<int> E) {
    int n = W.size();
    long long sum = 0;
    vector <array <int, 3>> ordenar;
    for(int i = 0;i < n;i++){
        ordenar.push_back({W[i], A[i], B[i]});
    }
    sort(ordenar.begin(), ordenar.end());
    for(int i = 0;i < n;i++){
        w[i+1] = ordenar[i][0];
        sum += (long long) (ordenar[i][1]);
        custo[i+1] = ordenar[i][1] - ordenar[i][2];
    }
    vector <long long> resposta;
    for(auto d : E){
        long long res = 0;
        vector <pair <long long, long long>> intervalos;
        intervalos.push_back({w[1], custo[1]});
        for(int i = 2;i <= n;i++){
            if(w[i] - w[i-1] > d){
                long long soma = intervalos[0].second;
                long long mn = intervalos[0].second;
                int tam = intervalos.size();
                for(int j = 1;j < intervalos.size();j++){
                    soma += intervalos[j].second;
                    if(j%2 == 0){
                        mn = min(mn, intervalos[j].second);
                    }
                    else if(j+1 != tam){
                        if(intervalos[j+1].first - intervalos[j-1].first <= d){
                            mn = min(mn, intervalos[j].second);
                        }
                    }
                }
                res += soma - (tam%2 == 1 ? mn : 0);
                intervalos.clear();
                intervalos.push_back({w[i], custo[i]});
            }
            else{
                intervalos.push_back({w[i], custo[i]});
            }
        }
        long long soma = intervalos[0].second;
        long long mn = intervalos[0].second;
        int tam = intervalos.size();
        for(int j = 1;j < intervalos.size();j++){
            soma += intervalos[j].second;
            if(j%2 == 0){
                mn = min(mn, intervalos[j].second);
            }
            else if(j+1 != tam){
                if(intervalos[j+1].first - intervalos[j-1].first <= d){
                    mn = min(mn, intervalos[j].second);
                }
            }
        }
        res += soma - (tam%2 == 1 ? mn : 0);
        resposta.push_back(sum-res);
    }
    return resposta;
}
#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...