P1428 小鱼比可爱
题目描述:
给定一个序列的🐟,对于每条🐟打印前面有多少🐟比它丑
思路:
这道题本来是一道入门水题的,因为数据量小,数据量大的话可以用树状数组写
对于输入的数据将它存在数组 中,因为存在0的情况,而树状数组下标从1开始,a[1],a[2],a[3]…代表前面0,1,2出现的次数,如果该点等于x的话,则之前[1,x-1]出现的次数为该题的答案.这个可以用树状数组的区间和函数在O(logn)时间上完成,然后更新该值出现的次数,这个时间复杂度也是O(logn)
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int c[100005];
int x[100005];
int lowbit(int x){
return x&(-x);
}
void updata(int i,int v){
while(i<=t){
c[i]+=v;
i+=lowbit(i);
}
}
int getsum(int i){
int res=0;
while(i){
res+=c[i];
i-=lowbit(i);
}
return res;
}
signed main(){
int n;
scanf("%lld",&n);
t=-1e9+5;
for(int i=1;i<=n;i++){
scanf("%lld",&x[i]);
t=max(t,x[i]);//得到需要更新的最大区间
}
for(int i=1;i<=n;i++){
printf("%lld ",getsum(x[i]));
updata(x[i]+1,1);
}
return 0;
}