思路就是减到lim=500之下,然后<=500部分提前求出。不知道为啥wa。求条
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=10005;
int n,a[N],b[N],p[N],f[10001][10001],s[N];
signed main(){
int lim=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>p[i]>>a[i]>>b[i];
s[i]=s[i-1]+b[i];
}
lim=500;
// for(int nw=0;nw<=10000;nw++){
// int now=nw;
// for(int i=1;i<=n;i++){
// if(p[i]>=now){
// now+=a[i];
// }
// else now-=b[i];
// now=max(now,0);
// }
// f[nw]=now;
// }
for(int i=0;i<=1000;i++){
if(p[n]>=i)f[i][n]=i+a[n];
else f[i][n]=max(i-b[n],0ll);
f[i][n+1]=f[i][n];
}
for(int j=n-1;j>=1;j--){
for(int i=0;i<=1000;i++){
if(p[j]>=i){
f[i][j]=f[i+a[j]][j+1];
}
else {
f[i][j]=f[max(i-b[j],0ll)][j+1];
}
}
}
int q;
cin>>q;
while(q--){
int x;
cin>>x;
int l=0,r=n,mid,ans=-1;
while(l<=r){
mid=(l+r)/2;
if(x-s[mid]<=lim){//最少执行多少次
ans=mid;
r=mid-1;
}
else l=mid+1;
}
// cout<<ans<<"a;sdfjka;s"<<endl;
// cout<<"aaaaa";
if(ans==-1){
cout<<x-s[n]<<endl;
}
else {
cout<<f[max(x-s[ans],0ll)][ans+1]<<endl;
}
// cout<<f[x]<<endl;
}
return 0;
}