您的位置:首页 > 其它

【JZOJ5280】【NOIP提高组模拟A组8.15】膜法师

2017-08-22 22:32 363 查看

Description



Data Constraint



Solution

我们考虑一个a[i]对于g满足条件当且仅当存在一个x(x>0)满足g*x<=a[i]<=g *x+k,我们可以处理一个前缀和,那么对于1-k的答案x,我们只要判一下小于x的数量是否小于f即可。对于k+1~n的答案,我们暴力枚举g *x<=a[i]<=g *x+k中的x,统计一下[g *x,g *x+k]中数的个数即可。时间复杂度O(TAlogA)。

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=2e6+5;
int a[maxn],f[maxn];
int test,n,m,p,i,t,j,k,l,x,y,z,mx;
bool cmp(int x,int y){
return x>y;
}
int main(){
//freopen("data.in","r",stdin);freopen("data.out","w",stdout);
scanf("%d",&test);
while (test){
test--;mx=0;
scanf("%d%d%d",&n,&m,&p);
memset(f,0,sizeof(f));
for (i=1;i<=n;i++)scanf("%d",&a[i]),mx=(mx>a[i])?mx:a[i],f[a[i]]++;
for (i=1;i<=mx;i++)f[i]+=f[i-1];
for (i=1;i<=m;i++)
if (f[i-1]<=p) printf("%d ",i);
for (i=m+1;i<=mx;i++){
t=0;
for (j=1;i*j<=mx && t+p<n;j++)
t+=f[(i*j+m>mx)?mx:i*j+m]-f[i*j-1];
if (t+p>=n) printf("%d ",i);
}
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: