tyvj 1463 智商问题

P1463 智商问题
时间: 1500ms / 空间: 131072KiB / Java类名: Main

背景

各种数据结构帝~
各种小姊妹帝~
各种一遍AC帝~ 来吧!

描述

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

输入格式

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

输出格式

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

测试样例1

输入


1 2 3 4 5 




5

输出





5

备注

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

题解:这道题stl二分就可以水过。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000003
using namespace std;
int n,m,x;
int a[N];
int maxn[N],minn[N];
int main()
{
  scanf("%d",&n);
  for (int i=1;i<=n;i++) scanf("%d",&a[i-1]);
  sort(a,a+n);
  while (scanf("%d",&x)==1)
  {
  int t=lower_bound(a,a+n,x)-a;
  printf("%d\n",t+1);
  }
}
但是想用来练习一下分块,结果发现如果每个块存储的是最后一位的下标,就会TLE一组,如果直接存储每个块最后一位的数值,在查找就可以AC,我也不太清楚为什么,个人觉得是数组寻址的问题。下面是TLE的代码,请大神指正。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N  1000003
using namespace std;
int n,m,x;
int a[N],last[N],cnt;
int work(int x)
{
  if (x<a[1]) return 1;
  if (x>a[n]) return n+1;
  for (int i=1;i<=m;i++)
   if (x>a[last[i-1]]&&x<=a[last[i]])
    {
      for (int j=last[i-1]+1;j<=last[i];j++)
       if (x<=a[j])
        return j;
    }
}
int main()
{
 scanf("%d",&n);
 for (int i=1;i<=n;i++) scanf("%d",&a[i]);
 sort(a+1,a+n+1);
 cnt=sqrt(n);
 if (n%cnt) m=n/cnt+1,last[m]=n;
 else m=n/cnt;
 for (int i=1;i<=n/cnt;i++)
  last[i]=i*cnt;
 while (scanf("%d",&x)==1)
  printf("%d\n",work(x));
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值