D. For Gamers. By Gamers.
最近又生病了 然后就休息了两天 人还真是休息不得 直接寄掉了 不管是手速还是思维啥的
看到这道题 很简单的一个变形都没看出来 只看出了二分 一直找单调性 就是想不到变形一下就可以了
我们可以发现这个式子是这样子的 H/d<h/D 然后这样显然没有单调性 我当时好像想假了 想了个六边形战士一定是最强的 就要用差来排序做
然后把分母分别乘过来 就发现都是自家人了 就很好做了 又有单调性
说实话我们观察一下C发现也挺小的 比1e9哪些 显然可以预处理(当时这个也没观察出来 挺失败的今天
预处理也是蛮好处理的 这里有个级数 c+c/2+c/3+...+c/c 我们把c提出来就是个级数了 是clogc的
然后对于m个询问 每次二分即可 O((m+c)logc)
#include <bits/stdc++.h>
using namespace std;
const int N =3e5+10;
const int M = 998244353;
const int mod = 998244353;
#define int long long
#define endl '\n'
#define Endl '\n'
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
void solve() {
int n,C;cin>>n>>C;
int f[C+1];
memset(f,0,sizeof f);
for(int i=1;i<=n;i++){
int c,d,h;cin>>c>>d>>h;
f[c]=max(f[c],d*h);
}
for(int i=1;i<=C;i++)
for(int j=2*i;j<=C;j+=i)
f[j]=max(f[j],f[i]*(j/i));
for(int i=1;i<=C;i++)f[i]=max(f[i],f[i-1]);
int m;cin>>m;
while(m--){
int D,H;cin>>D>>H;
if(D*H>=f[C])cout<<-1<<Endl;
else cout<<upper_bound(f,f+C,D*H)-f<<" ";
}
}
signed main(){
fast
int T;T=1;
while(T--) {
solve();
}
return ~~(0^_^0);
}
标签:Educational,const,Gamers,int,Codeforces,125,define
From: https://www.cnblogs.com/ycllz/p/16633486.html