#1513 : 小Hi的烦恼
时间限制:
5000ms
单点时限:
1000ms
内存限制:
1024MB
-
4 1 1 2 2 1 2 3 3 3 2 3 2 1 1 3 4 4 4 4 4
样例输出
-
0 1 0 3
描述
小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好。
小Hi在高中期间参加了市里的期末考试,一共五门:语文、数学、英语、物理、化学。
成绩出来之后,小Hi发现有些同学,所有科目都考的比他好,他很烦恼。所以他想知道所有科目都比自己名次靠前的同学的人数。
为了方便,可以认为不存在两个人某一门名次是相同的。
其他同学们也想知道有多少人全面碾压了他们,所以你需要对所有人输出答案。
输入
第一行,一个正整数N(N <= 30000),表示人数。
接下来N行,每行五个整数,分别表示五门课依次的排名。
输出
输出共N行,每行一个整数,表示答案。
只有五门科目
b[x][y][z]=1表示第x个人第y科分数比第z个人的第y科分数要高
b[x][y][z]=0说明第x个人第y科分数比第z个人的第y科分数低
很明显若bet[x][1][z] & bet[x][2][z] & bet[x][3][z] & bet[x][4][z] & bet[x][5][z] = 1说明第z个人被第x个人完全碾压
不过想要求出所有的b[x][y][z],复杂度数O(n²)的,不过最后一维不是1就是0,所以可以用bitset
开个长度为n的二维bitset即可,最后答案就是(bet[x][1] & bet[x][2] & bet[x][3] & bet[x][4] & bet[x][5])中1的个数
#include<stdio.h>
#include<bitset>
using namespace std;
int sc[6][30005];
bitset<30005> ans, b[6][30005];
int main(void)
{
int n, i, j, x;
scanf("%d", &n);
for(i=1;i<=n;i++)
{
for(j=1;j<=5;j++)
{
scanf("%d", &x);
sc[j][x] = i;
}
}
for(i=1;i<=5;i++)
{
for(j=2;j<=n;j++)
{
b[i][sc[i][j]] = b[i][sc[i][j-1]];
b[i][sc[i][j]][sc[i][j-1]] = 1;
}
}
for(i=1;i<=n;i++)
{
ans = b[1][i]&b[2][i]&b[3][i]&b[4][i]&b[5][i];
printf("%d\n", ans.count());
}
return 0;
}