60pts,其余全wa,比答案输出的大。
#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
#define fi first
#define se second
#define int long long
using namespace std;
int dp[10010][1010][2], n, newn, q, lg[1010];
vector <int> v, w;
map <int, pair<int, int> > mp;
signed main() {
cin.tie(0) -> ios :: sync_with_stdio(0);
v.emplace_back(0), w.emplace_back(0);
lg[0] = -1;
for(int i = 1; i <= 100; i ++)
lg[i] = lg[i >> 1] + 1;
cin >> n;
for(int i = 1; i <= n; i ++) {
int a, b, c; cin >> a >> b >> c;
int st = newn + 1;
for(int j = 0; j <= lg[c]; j ++) {
if(c - (j + 1) >= 0) {
c -= (j + 1);
v.emplace_back(a * (1 << j));
w.emplace_back(b * (1 << j));
++ newn;
}
}
if(c != 0) {
v.emplace_back(a * c);
w.emplace_back(b * c);
++ newn;
}
int en = newn;
mp[i] = {st, en};
}
// for(int i = 1; i <= newn; i ++) cout << v[i] << " "; cout << "\n";
// for(int i = 1; i <= newn; i ++) cout << w[i] << " "; cout << "\n";
for(int i = 1; i <= newn; i ++) {
for(int j = 0; j <= 1000; j ++) {
if(j >= v[i]) dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j - v[i]][0] + w[i]);
else dp[i][j][0] = dp[i - 1][j][0];
}
}
for(int i = newn; i >= 1; i --) {
for(int j = 0; j <= 1000; j ++) {
if(j >= v[i]) dp[i][j][1] = max(dp[i + 1][j][1], dp[i + 1][j - v[i]][1] + w[i]);
else dp[i][j][1] = dp[i + 1][j][1];
}
}
cin >> q;
while(q --) {
int d, e; cin >> d >> e; d ++;
int st = mp[d].fi, en = mp[d].se;
int ans = 0;
for(int i = 0; i <= e; i ++) {
ans = max(ans, dp[st - 1][i][0] + dp[en + 1][e - i][1]);
}
cout << ans << "\n";
}
return 0;
}