# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1218511 | nguyenduydung109 | 나일강 (IOI24_nile) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct DSU {
int n;
vector<int> p, sz, minC0, minC1;
ll extra;
DSU(int _n, vector<ll>& C) : n(_n), p(n,-1), sz(n,1), minC0(n,LLONG_MAX), minC1(n,LLONG_MAX), extra(0) {
for(int i=0;i<n;i++){
p[i]=i;
if(i%2==0) minC0[i]=C[i];
else minC1[i]=C[i];
extra += C[i]; // mỗi nhóm 1 thành phần sẽ lẻ → cộng C[i]
}
}
int find(int x){ return p[x]==x ? x : p[x] = find(p[x]); }
void unite(int a, int b){
a = find(a); b = find(b);
if(a==b) return;
// remove old extra phí 2 nhóm
if(sz[a]%2) extra -= min(minC0[a], minC1[a]);
if(sz[b]%2) extra -= min(minC0[b], minC1[b]);
// merge nhỏ vào lớn
if(sz[a] < sz[b]) swap(a,b);
p[b] = a;
sz[a] += sz[b];
minC0[a] = min(minC0[a], minC0[b]);
minC1[a] = min(minC1[a], minC1[b]);
// cộng extra mới nếu nhóm lẻ
if(sz[a]%2) extra += min(minC0[a], minC1[a]);
}
};
vector<ll> calculate_costs(vector<int>& W, vector<ll>& A, vector<ll>& B, vector<int>& E){
int N = W.size(), Q = E.size();
vector<ll> C(N);
ll S = 0;
for(int i=0;i<N;i++){
C[i] = A[i] - B[i];
S += B[i];
}
vector<int> idx(N);
iota(idx.begin(), idx.end(), 0);
sort(idx.begin(), idx.end(), [&](int i, int j){ return W[i] < W[j]; });
vector<pair<ll, pair<int,int>>> edges;
for(int z=0;z<idx.size();z++){
int i = idx[z];
if(z+1 < N) edges.push_back({ llabs(W[idx[z+1]] - W[i]), {i, idx[z+1]} });
if(z+2 < N) edges.push_back({ llabs(W[idx[z+2]] - W[i]), {i, idx[z+2]} });
}
sort(edges.begin(), edges.end());
vector<pair<int,int>> Qs;
for(int i=0;i<Q;i++) Qs.push_back({E[i], i});
sort(Qs.begin(), Qs.end());
DSU dsu(N, C);
vector<ll> ans(Q);
int epos = 0;
for(auto& [limit, qi] : Qs){
while(epos < edges.size() && edges[epos].first <= limit){
dsu.unite(edges[epos].second.first, edges[epos].second.second);
epos++;
}
ans[qi] = S + dsu.extra;
}
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int N; cin >> N;
vector<int> W(N);
vector<ll> A(N), B(N);
for(int i=0;i<N;i++) cin >> W[i] >> A[i] >> B[i];
int Q; cin >> Q;
vector<int> E(Q);
for(int i=0;i<Q;i++) cin >> E[i];
auto R = calculate_costs(W,A,B,E);
for(ll x : R) cout << x << "\n";
return 0;
}