zoukankan      html  css  js  c++  java
  • 洛谷 P1428 小鱼比可爱

    P1428 小鱼比可爱
    题目提供者yeszy
    标签 树状数组
    难度 入门难度
    题目描述
    人比人,气死人;鱼比鱼,难死鱼。小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度。参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱程度,很显然整数越大,表示这只鱼越可爱,而且任意两只鱼的可爱程度[color=red]可能一样[/color]。由于所有的鱼头都朝向左边,所以每只鱼只能看见在它左边的鱼的可爱程度,它们心里都在计算,在自己的眼力范围内有多少只鱼不如自己可爱呢。请你帮这些可爱但是鱼脑不够用的小鱼们计算一下。
    输入输出格式
    输入格式:
    第一行输入一个整数n,表示鱼的数目。
    第二行内输入n个整数,用空格间隔,依次表示从左到右每只小鱼的可爱程度。
    输出格式:
    行内输出n个整数,用空格间隔,依次表示每只小鱼眼中有多少只鱼不如自己可爱。
    输入输出样例
    输入样例#1:
    6
    4 3 0 5 1 2
    输出样例#1:
    0 0 0 3 1 2
    说明
    n<=100

    /*
    树状数组 o(nlogn).
    s数组维护一个数当前出现了几次.
    然后查询的时候求个和即可. 
    然后问题来了.
    树状数组下标不能从0开始记录.
    然后下标后移一位从一开始记录.
    增加维护的时候要枚举到数据上限. 
    */
    #include<iostream>
    #include<cstdio>
    #define MAXN 101
    using namespace std;
    int n,s[MAXN],x,max1=-1e8;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    int lowbit(int t){
        return t&-t;
    }
    int query(int x){
        int tot=0;while(x) tot+=s[x],x-=lowbit(x);return tot;
    }
    void add(int t,int x){
        while(t<=101){
            s[t]+=x;
            t+=lowbit(t);
        }
    }
    int main(){
        n=read();
        for(int i=1;i<=n;i++){
            x=read();
            printf("%d ",query(x));
            add(x+1,1);
        }
        return 0;
    }
  • 相关阅读:
    Kafka使用代码设置offset值
    单机wordcount
    队列:队列在线程池等有限资源池中的应用
    栈:如何实现浏览器的前进和后退功能?
    Codeforces Beta Round #57 (Div. 2) E. Enemy is weak
    Codeforces Round #345 (Div. 1) A. Watchmen
    Codeforces Round #291 (Div. 2) B. Han Solo and Lazer Gun
    zoj4027 Sequence Swapping
    zoj4028 LIS
    zoj 3946 Highway Project
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070805.html
Copyright © 2011-2022 走看看