hihocoder 1513 小Hi的烦恼

别看了……bitset入门题……

bitset就是将32个01位操作整合成一个32位整数,一次位操作。
作为一个位运算的优化方法,可以省去 ( 2^5 )的时间复杂度。
有些大佬 sb 就故意让你 ( O ( n^2 ) )过不了,加个 bitset 优化就可以卡过去了。
不过也可以说是一个很巧妙的操作。

这题是今晚出去撸串的时候听其他三个沙雕吹的一道题,今晚补上。

题意:
给你一群学生每门功课的排名,总共 5 门学科,问你对于每个学生,所有成绩排名都比他高的学生数有多少。

不存在共列一个名次的数据。

思路:
很暴力……
直接( n^2 ) + bitset 优化就可以卡过

但是不知道为什么,我的循环在 [ 1, n ] 就 T 了,[0, n ) 就 A 了……

#include <bits/stdc++.h>

#define each(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define reach(i, n) for (int(i) = n - 1; (i) >= 0; (i)--)
#define range(i, st, en) for (int(i) = (st); (i) <= (en); (i)++)
#define rrange(i, st, en) for (int(i) = (en); (i) >= (st); (i)--)
#define fill(ary, num) memset((ary), (num), sizeof(ary))

using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 3e4 + 5;

bitset<maxn> up[5][maxn], res;
int rnk[maxn], rrnk[5][maxn];

int main()
{
    int n;
    scanf("%d", &n);
    each(i, n) each(j, 5) scanf("%d", &rrnk[j][i]);
    each(c, 5)
    {
        each(i, n) rnk[rrnk[c][i]] = i + 1;
        range(i, 2, n)
        {
            up[c][rnk[i]] = up[c][rnk[i - 1]];
            up[c][rnk[i]][rnk[i - 1]] = 1;
        }
    }
    range(i, 1, n)
    {
        res = up[0][i] & up[1][i] & up[2][i] & up[3][i] & up[4][i];
        printf("%ld\n", res.count());
    }
    return 0;
}