TYVJ1463 智商问题【数据结构】【分块】
描述 #include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e6;
int a[N+5],last[N+5];
int blk,n,cnt,x;
int query(int x)
{
if(x>a[n])return n+1;
if(x<a[1])return 1;
for(int i=1;i<=cnt+1;i++)
{
if(x>last[i-1]&&x<=last[i])//先选出在那个块里边
for(int j=1;j<=blk;j++)//再暴力枚举块的位置
if(a[j+(i-1)*blk]>=x)return j+(i-1)*blk;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
blk=sqrt(n);//一块的长度
sort(a+1,a+1+n);
if(n%blk)cnt=blk;
else cnt=blk+1;//一共分出sqrt(n)块或sqrt(n)+1块
for(int i=1;i<=cnt;i++)
last[i]=a[i*blk];//存储一个块里边最后的那个数
last[cnt]=a[n];
while(~scanf("%d",&x))
printf("%dn",query(x));
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |