• HiHoCoder1513:小Hi的烦恼——题解


    https://hihocoder.com/problemset/problem/1513

    小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好。

    小Hi在高中期间参加了市里的期末考试,一共五门:语文、数学、英语、物理、化学。

    成绩出来之后,小Hi发现有些同学,所有科目都考的比他好,他很烦恼。所以他想知道所有科目都比自己名次靠前的同学的人数。

    为了方便,可以认为不存在两个人某一门名次是相同的。

    其他同学们也想知道有多少人全面碾压了他们,所以你需要对所有人输出答案。

    解题方法提示

    作为从没有用过bitset的人来说觉得有必要做一道题试验下。

    看了“解题方法提示”的你相信已经会了。

    不会可以看一下这个人的博客:http://www.cnblogs.com/hua-dong/p/8196081.html

    还不会,那你可能和我一样需要思考。

    sa[i][j]:i人j科排名。

    rk[i][j]:j科i排名的人。

    s[i][j]:j科前i排名的人用二进制表示的结果。

    那么这样一来如果想求第i个人的总排名,那么就并一下s[sa[i][1~5]-1][1~5]得到的二进制数查一下里面的1有多少个即可。

    显然复杂度是O(n^2)的,但是类似压位的想法可以降复杂度,使用c++的bitset能将复杂度变为O(n^2/32)。

    #include<stack>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<bitset>
    #include<algorithm>
    using namespace std;
    inline int read(){
        int x=0,w=1;char ch=0;
        while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return x*w;
    }
    const int N=3e4+5;
    bitset<N>s[N][6],tmp;
    int rk[N][6],sa[N][6];
    int main(){
        int n=read();
        for(int i=1;i<=n;i++){
        for(int j=1;j<=5;j++){
            sa[i][j]=read();
            rk[sa[i][j]][j]=i;
        }
        }
        for(int i=1;i<=5;i++){
        for(int j=1;j<=n;j++){
            s[j][i]=s[j-1][i];
            s[j][i].set(rk[j][i]);
        }
        }
        for(int i=1;i<=n;i++){
        tmp=s[sa[i][1]-1][1];
        for(int j=2;j<=5;j++){
            tmp&=s[sa[i][j]-1][j];
        }
        printf("%d
    ",(int)tmp.count());
        }
        return 0;
    }

    +++++++++++++++++++++++++++++++++++++++++++

    +本文作者:luyouqi233。               +

    +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

    +++++++++++++++++++++++++++++++++++++++++++

  • 相关阅读:
    用位运算实现十进制转换为二进制
    【Zhejiang University PATest】02-3. 求前缀表达式的值
    【Zhejiang University PATest】02-1. Reversing Linked List
    【Tsinghua OJ】隧道(Tunel)问题
    冒泡排序及其优化
    有序向量的查找算法
    【Tsinghua OJ】灯塔(LightHouse)问题
    有序向量的去重算法
    【Tsinghua OJ】祖玛(Zuma)问题
    倒水问题(《怎样解题》中的经典问题)
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/8705620.html
Copyright © 2020-2023  润新知