D - For Gamers. By Gamers.
分析:
-
阅读理解+打表+二分答案(神仙打表)
-
令我方的伤害和血量分别为 ( a , b ) (a,b) (a,b),敌方为 ( c , d ) (c,d) (c,d), 我方的数量为n
则,我方能打死敌方的条件是:
d n a < b c n a b > c d \frac{d}{na}<\frac{b}{c} \\ nab>cd nad<cbnab>cd -
b [ i ] b[i] b[i] 表示花费i最大的伤害值(转换之后的),打个表即可
-
注意:调和级数的复杂度 O ( n × l n ( n ) ) O(n\times ln(n)) O(n×ln(n))
#include <bits/stdc++.h>
#define int long long
#define Pa pair<int,int>
using namespace std;
const int N=1e6+5;
int f[N],b[N];
void solve()
{
int n,c;
cin>>n>>c;
for(int i=1;i<=n;i++)
{
int x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
f[x]=max(f[x],y*z);
}
for(int i=1;i<=c;i++)
{
if(f[i])
{
for(int j=1;j*i<=c;j++)
{
b[i*j]=max(b[i*j],f[i]*j);
}
}
}
for(int i=1;i<=c;i++) b[i]=max(b[i],b[i-1]);
int m; cin>>m;
while(m--)
{
int x,y;
scanf("%lld%lld",&x,&y);
x*=y;
int l=1, r=c, ans=0;
while(l<=r)
{
int mid=l+r>>1;
if(b[mid]>x) r=mid-1, ans=mid;
else l=mid+1;
}
if(ans) cout<<ans<<"\n";
else cout<<"-1\n";
}
}
signed main()
{
int T=1;
//cin>>T;
while(T--) solve();
}