1. 程式人生 > >【tyvj1463】智商問題 [分塊][二分查找]

【tyvj1463】智商問題 [分塊][二分查找]

cst name clas 1-1 rip 人的 i++ format nbsp

Background

各種數據結構帝~
各種小姊妹帝~
各種一遍AC帝~ 來吧!

Description

某個同學又有很多小姊妹了
他喜歡聰明的小姊妹 所以經常用神奇的函數來估算小姊妹的智商
他得出了自己所有小姊妹的智商
小姊妹的智商都是非負整數
但是這個同學看到別的同學的小姊妹
也喜歡用神奇的函數估算一下
然後看看這個小姊妹在自己的小姊妹群體中排在第幾位…
(這麽邪惡的興趣…)

InputFormat

第一行一個整數N 代表小姊妹的個數
第二行N個整數 代表這位同學N個小姊妹的智商

接下來若幹行 每行一個整數
代表這位同學看中的別人的小姊妹的智商
0<=智商<=2^31-1
0<=N<=1000000

OutputFormat

輸出若幹行
每行一個整數 回答新的小姊妹
在原來小姊妹中智商的排名

SampleInput

5

1 2 3 4 5

1

2

3

4

5

SampleOutput

1

2

3

4

5


tyvj掛了,交不了

隨便寫了一個代碼,細節大概是錯了吧。

練習建立分塊而已。。。。QwQ

不如寫二分

 1 #include<cmath>
 2 #include<cstdio>
 3
#include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 8 const int maxn=100005; 9 10 int n,h; 11 int a[maxn],c[maxn],mxnum[(int)sqrt(maxn)+1],mxsite[(int)sqrt(maxn)+1]; 12 13 int main(){ 14 freopen("temp.in","r",stdin); 15 scanf("
%d",&n); 16 for(int i=0;i<n;i++) scanf("%d",&a[i]); 17 sort(a,a+n); 18 for(int i=0,h=(int)sqrt(n),v=1;i<n;i++){ 19 c[i]=v; 20 if(i==n-1){ 21 h=v; 22 break; 23 } 24 if((i+1)%h==0) v++; 25 } 26 for(int i=n-1;i>=0;i--) 27 if(c[i]!=c[i+1]){ 28 mxnum[c[i]]=a[i]; 29 mxsite[c[i]]=i; 30 } 31 int num,site; 32 while(scanf("%d",&num)!=NULL){ 33 site=0; 34 for(int i=k;i;i--){ 35 if(mxnum[i]<=num){ 36 site=mxsite[i]; 37 break; 38 } 39 } 40 if(site==0){ 41 puts("1"); 42 } 43 else{ 44 for(int i=site;i<n;i++) 45 if(num<=a[i]){ 46 printf("%d\n",i+1); 47 break; 48 } 49 printf("%d\n",n+1); 50 } 51 } 52 return 0; 53 }

【tyvj1463】智商問題 [分塊][二分查找]