HiHoCoder1513:小Hi的煩惱——題解

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

小Hi從小的一大興趣愛好就是學習,可是他發現儘管他認真學習,依舊有學神考的比他好。c++

小Hi在高中期間參加了市裏的期末考試,一共五門:語文、數學、英語、物理、化學。學習

成績出來以後,小Hi發現有些同窗,全部科目都考的比他好,他很煩惱。因此他想知道全部科目都比本身名次靠前的同窗的人數。spa

爲了方便,能夠認爲不存在兩我的某一門名次是相同的。code

其餘同窗們也想知道有多少人全面碾壓了他們,因此你須要對全部人輸出答案。htm

解題方法提示blog

做爲從沒有用過bitset的人來講以爲有必要作一道題試驗下。get

看了「解題方法提示」的你相信已經會了。博客

不會能夠看一下這我的的博客: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\n",(int)tmp.count());
    }
    return 0;
}

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

+本文做者:luyouqi233。               +

+歡迎訪問個人博客:http://www.cnblogs.com/luyouqi233/+

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

相關文章
相關標籤/搜索