题解:P14011 [POCamp 2023] 珿求 / bootfall
更好的阅读体验
首先,我们预处理出
对于一组询问,假设我们派出的进攻、防守兵力分别为
预处理
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define N 406
using namespace std;
int n,q,a[N],b[N],f[2][N*N],g[N*N],h[N*N],sa,sb;
int win,lose,draw;
main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&a[i],&b[i]),sa+=a[i];
memset(f,-0x3f,sizeof(f)),f[0][0]=0;
for(int i=1;i<=n;i++)
{
f[i&1][0]=(sb+=b[i]);
for(int j=0;j<=sa;j++)
{
f[i&1][j]=f[(i&1)^1][j]+b[i];
if(a[i]<=j)f[i&1][j]=max(f[i&1][j],f[(i&1)^1][j-a[i]]);
}
}
for(int i=0;i<=sa;i++)g[i]=i+f[n&1][i];
for(int i=sa;~i;i--)
h[i]=max(h[i+1],f[n&1][i]),g[i]=max(g[i+1],g[i]);
scanf("%lld",&q);
while(q--)
{
int x,y;scanf("%lld%lld",&x,&y);
int w=0,d=0;
if(x-f[n&1][0]<=0)d++;
if(h[y+1]>x)w++;
else {
if(h[y+1]==x)d++;
if(g[y+1]>x+y)w++;
else if(g[y+1]==x+y)d++;
}
if(w)win++;
else if(d)draw++;
else lose++;
}
printf("%lld %lld %lld\n",win,draw,lose);
return 0;
}