tyvj1463[智商问题]

描述

某个同学又有很多小姊妹了
他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商
他得出了自己所有小姊妹的智商
小姊妹的智商都是非负整数
但是这个同学看到别的同学的小姊妹
也喜欢用神奇的函数估算一下
然后看看这个小姊妹在自己的小姊妹群体中排在第几位…
(这么邪恶的兴趣…)

输入格式

第一行一个整数N 代表小姊妹的个数
第二行N个整数 代表这位同学N个小姊妹的智商
接下来若干行 每行一个整数
代表这位同学看中的别人的小姊妹的智商
0<=智商<=2^31-1
0<=N<=1000000

输出格式

输出若干行
每行一个整数 回答新的小姊妹
在原来小姊妹中智商的排名

测试样例1

输入

5
1 2 3 4 5
1
2
3
4
5
输出

1
2
3
4
5
备注

数据量很大
C语言用scanf输入输出!
另外 这个同学的小姊妹群体在这个题中是不会变的~
他会在看完所有别的同学的小姊妹之后…
大家听说过 苏格拉底和麦田的故事的吧…
Bob HAN


solution: 二分 || 分块

PS: 此题只要是个算法就能AC,可以用来练习分块

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

#define N 1000010

int a[N], last[N];
int blk, n, cnt;

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;
        }
    }
    return 0;
}

int main(){
    scanf( "%d", &n);
    for ( int i = 1; i <= n; i++) scanf( "%d", &a[i]);
    blk = sqrt(n);
    if ( n % blk ) cnt = n / blk+1;
    else cnt = n / blk;
    int x;
    sort( a+1, a+1+n );
    for ( int i = 1; i <= cnt; i++)
        last[i] = a[i*blk];
    last[cnt] = a[n];
    while ( ~scanf( "%d", &x) ){
        printf( "%d\n", query(x));
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值