Educational Codeforces Round 125 D

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);
}
posted @ 2022-08-28 19:49  ycllz  阅读(22)  评论(0)    收藏  举报