★实验任务
Uuirs 继续玩那个游戏,她又玩了 n 次,得到了 n 个分数。但这次,她每得到一个分数
时,想知道的是当前这个分数的排名。注意,分数越低,排名越高,一个分数的排名取决于
有多少个分数比它小。她发现自己脑洞足够大,希望你再帮她写个程序解决这个问题。
★数据输入
输入第一行是一个整数 n(1<=n<=10^6),表示有 n 个分数。
接下来 n 行,每行一个整数表示一个分数[0,10^18)
★数据输出
对于每个分数,输出一个值, 表示当前此分数的排名。
输入示例 输出示例
Uuirs 继续玩那个游戏,她又玩了 n 次,得到了 n 个分数。但这次,她每得到一个分数
时,想知道的是当前这个分数的排名。注意,分数越低,排名越高,一个分数的排名取决于
有多少个分数比它小。她发现自己脑洞足够大,希望你再帮她写个程序解决这个问题。
★数据输入
输入第一行是一个整数 n(1<=n<=10^6),表示有 n 个分数。
接下来 n 行,每行一个整数表示一个分数[0,10^18)
★数据输出
对于每个分数,输出一个值, 表示当前此分数的排名。
输入示例 输出示例
5 1
1 2
2 3
3 1
1 3
2
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 1000005
int sum[N];
__int64 a[N],b[N];
int t;
inline int lowbit(int x){
return x&(-x);
}
inline int rank(int x){
int r=0;
while(x>0){
r+=sum[x];
x-=lowbit(x);
}
return r;
}
inline void update(int x){
while(x<=t){
sum[x]+=1;
x+=lowbit(x);
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%I64d",a+i);
b[i]=a[i];
}
sort(b+1,b+1+n);
t=unique(b+1,b+1+n)-b;
for(int j=1;j<=n;++j){
int rank_=lower_bound(b+1,b+t,a[j])-b;
update(rank_);
printf("%d\n",rank(rank_-1)+1);
}
return 0;
}