// nikulid
// written in neovim
#include "nile.h"
#include <algorithm>
// #include <iostream>
using namespace std;
/*
!!! REMEMBER TO REMOVE #include <iostream> BEFORE SUBMITTING !!!
--- WEIRD CASES TO CONSIDER ---
> multiple artifacts of the same weight
>
*/
#define ll long long
#define pb push_back
#define mp make_pair
vector<ll> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E) {
int n = (int)W.size();
int Q = (int)E.size();
vector<ll> R(Q, 0);
// W[] is the weights
// start by sorting W in ascending order
vector<pair<int, pair<int, int>>> ns(n);
pair<int, pair<int, int>> p;
int base_cost=0;
for(int i=0; i<n; i++){
p = mp(W[i], mp(A[i], B[i]));
base_cost += A[i];
ns[i] = p;
}
sort(ns.begin(), ns.end());
vector<pair<ll, ll>> dp(n);
vector<ll> w(n),a(n),b(n);
for(int i=0; i<n; i++){
w[i] = ns[i].first;
a[i] = ns[i].second.first;
b[i] = ns[i].second.second;
}
ll D;
ll possible;
pair<ll,ll> hereA;
// ---
/*
if(0==1){
cout<<"<--- INIT START --->\n";
cout<<"w[] >> \t";
for(int i=0; i<n; i++){
cout<<w[i]<<",\t";
}
cout<<"\na[] >> \t";
for(int i=0; i<n; i++){
cout<<a[i]<<",\t";
}
cout<<"\nb[] >> \t";
for(int i=0; i<n; i++){
cout<<b[i]<<",\t";
}
cout<<"\n\n<--- INIT FINISH --->\n";
}
*/
// ---
for(int _=0; _<Q; _++){
D = E[_];
dp = vector<pair<ll,ll>>(n, mp(-1, -1));
dp[0].first = a[0];
// dp[i].first = NOT in a pair
// dp[i].second = IS in a pair
for(int i=1; i<n; i++){
// calculate dp[i]..
// [i].first
possible=69;
possible = dp[i-1].first + a[i];
if(dp[i-1].second != -1){
possible = min(possible, dp[i-1].second + a[i]);
}
hereA.first = possible;
// [i].second
possible = -1;
if(abs(w[i-1] - w[i]) <= D){
// CASE: adjacent
possible = dp[i-1].first - a[i-1] + b[i-1] + b[i];
//if(0==1){cout<<"$firstcase:"<<possible<<"| ";}
}
/*
else if(0==1){
cout<<"firstcase:NONE| ";
}
*/
if(i>1 && abs(w[i-2] - w[i]) <= D){
// CASE: not adjacent
possible = min(possible, dp[i-2].first - a[i-2] + b[i-2] + a[i-1] + b[i]);
}
hereA.second = possible;
// cout<<"$hereA:"<<hereA.first<<","<<hereA.second<<"|";
dp[i] = hereA;
}
R[_] = dp[n-1].first;
if(dp[n-1].second != -1){
R[_] = min(R[_], dp[n-1].second);
}
/*
if(0==1){
cout<<"\nquery "<<_<<" has the following `dp[]`:\n";
cout<<"YESPAIR\t";
for(int i=0; i<n; i++){
cout<<dp[i].second<<",\t";
}
cout<<"\nNOPAIR\t";
for(int i=0; i<n; i++){
cout<<dp[i].first<<",\t";
}
cout<<"\n\n";
}
*/
}
return R;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |