题解:P11470 昆明之泪
Night_sea_64 · · 题解
这题比较简单,但我场上因为来晚+中途离开导致最后没调出来。
基本上看到数据范围就能会这道题了。发现
然后看那个询问。把式子整体减去
这里
这样的话,给
时间复杂度为
#include<iostream>
#include<cstring>
#define int long long
using namespace std;
int n,m,x[1010],y[1010];
int f[200010];
bool chk(int a,int b,int k)
{
if(k+b-a>200000)return 0;
return f[max(0ll,k+b-a)]>=k;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
memset(f,-999999,sizeof(f));
f[100000]=100000;
for(int i=1;i<=n;i++)
{
if(x[i]>=0)
{
for(int j=200000;j>=x[i];j--)
f[j]=max(f[j],f[j-x[i]]+y[i]);
}
else
{
for(int j=0;j<=200000+x[i];j++)
f[j]=max(f[j],f[j-x[i]]+y[i]);
}
}
for(int i=200000;i>=0;i--)f[i]=max(f[i],f[i+1]);
cin>>m;
while(m--)
{
int a,b;
cin>>a>>b;
int l=-1e12,r=200000+a-b,ans=100000-b;
while(l<=r)
{
int mid=(l+r)/2;
if(chk(a,b,mid))l=mid+1,ans=mid;
else r=mid-1;
}
cout<<ans-100000+b<<endl;
}
return 0;
}