count 2

实验任务
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;        
}        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值