# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1181691 | sagnbaevv | 나일강 (IOI24_nile) | C++17 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
static const long long INF = 1LL<<60;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int N; cin >> N;
vector<long long> W(N), A(N), B(N), save(N);
for(int i=0; i<N; i++){
cin >> W[i] >> A[i] >> B[i];
save[i] = A[i] - B[i];
}
int Q; cin >> Q;
vector<long long> E(Q);
for(int i=0; i<Q; i++){
cin >> E[i];
}
vector<int> idx(N);
iota(idx.begin(), idx.end(), 0);
sort(idx.begin(), idx.end(), [&](int p, int q){
return W[p] < W[q];
});
vector<long long> Ws(N), Sv(N);
for(int i=0; i<N; i++){
Ws[i] = W[idx[i]];
Sv[i] = save[idx[i]];
}
long long sumA = 0;
for(int i=0; i<N; i++){
sumA += A[i];
}
for(int qi=0; qi<Q; qi++){
long long D = E[qi];
long long ans = 0;
vector<long long> dp(N+1, 0LL);
long long bestVal = -INF;
int leftPtr = 0;
for(int k=1; k<=N; k++){
while(Ws[k-1] - Ws[leftPtr] > D){
leftPtr++;
}
bestVal = -INF;
for(int i=leftPtr; i<k-1; i++){
long long cand = dp[i] + Sv[i];
if(cand > bestVal) bestVal = cand;
}
dp[k] = dp[k-1];
if(bestVal != -INF){
long long possible = bestVal + Sv[k-1];
if(possible > dp[k]) dp[k] = possible;
}
}
long long totalSaving = dp[N];
long long cost = sumA - totalSaving;
cout << cost << "\n";
}
return 0;
}