引用出题人思路:为了让MEX尽量大,我们应该让所有ti不为0的数都不一样,同时我们想要所有数的和尽量小,根据贪心策略,对于越大的 ti ,对应的 i 应该越小。例如,我们想要让 MEX 等于 4,构造的总和最小的序列是 1,1,1,2,2,3,这样 t1=3,t2=2,t3=1。
因此,当 MEX等于 k+1 时,M 的下限应该是
化简后是:
对于每个询问,可以二分出最大的一个不超过 M 的 vk,输出 k+1 即可。注意二分过程不要溢出了。
P.S. 由于这个数这是 O(k3) 级别的,也可以暴力求出所有在 10^18以内的 vk。
Code:
#include<iostream>
#define int long long
using namespace std;
int32_t main()
{
int t,m;cin>>t;
auto check = [&](int x){
return ((x*x*x+3*x*x+2*x)/6<=m);
};
while(t--)
{
cin>>m;
int l=1,r=2e6;
while(l<r)
{
int mid=(l+r+1)>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l+1<<endl;
}
}