Description
N,M≤109, K<min(N,M)
Solution
显然答案ans是
0<ans<max(N,M)
那么就二分出一个答案,判断全局有多少个小于它,这个用分块即可,
复杂度: O(Qlog(n)∗n−−√)
code
#include <cstdio>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int n,m,m1,ans;
int FD(int v,int T)
{
int ans=0;
for(int i=1,nx;i<=n&&i<=v;i=nx+1)
{
nx=v/(v/i);
ans+=(nx-i+1)*(v/i);
if(ans>=T||ans<0)return ans;
}
return ans;
}
int main()
{
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
int q,w,v;
scanf("%d%d%d",&n,&m,&m1);
if(n>m)swap(n,m);
while(m1--)
{
scanf("%d",&v);
if(v==0){printf("0\n");continue;}
int l=1,r=m;
while(l<r)
{
int mid=(l+r)>>1;
if(FD(mid,v)>=v)r=mid;
else l=mid+1;
}
printf("%d\n",l);
}
return 0;
}