二分,分块都可以,权当练习。
#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool scan_d(T &ret)
{
char c;
int sgn;
if(c=getchar(),c==EOF) return 0; //EOF
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
const int MAXN = 1e6+10;
int num[MAXN];
int last[MAXN];
int block,siz;
int n;
int solve(int x)
{
for(int i = 1; i <= siz; ++i)
{
if(x <= last[i] && x > last[i-1])
{
int l = (i-1)*block+1;
int r = i*block;
if(r > n) r = n;
for(int i = l; i <= r; ++i)
{
if(num[i] >= x)
return i;
}
}
}
}
int main()
{
scan_d(n);
for(int i = 1; i <= n; ++i)
scan_d(num[i]);
sort(num+1,num+n+1);
block = sqrt(n);
siz = n/block;
if(n%block) ++siz;
for(int i = 1; i < siz; ++i)
last[i] = num[i*block];
last[siz] = num[n];
int x;
while(~scanf("%d",&x))
{
if(x <= num[1])
printf("1\n");
else if(x == num[n])
printf("%d\n",n);
else if(x > num[n])
printf("%d\n",n+1);
else
printf("%d\n",solve(x));
}
return 0;
}