思路:
用bitset判断交集个数
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) const int N=3e4+5; int rnk[N][5]; int num[N][5];//在第j门课排名为i的同学的编号 bitset<N>s[N][5],tmp;//在第j门课小于排名i的状态 int main(){ /*ios::sync_with_stdio(false); cin.tie(0);*/ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=0;j<5;j++){ scanf("%d",&rnk[i][j]); num[rnk[i][j]][j]=i; } } for(int j=0;j<5;j++){ for(int i=2;i<=n;i++){ s[i][j]=s[i-1][j]; s[i][j].set(num[i-1][j]); } } for(int i=1;i<=n;i++){ tmp=s[rnk[i][0]][0]; for(int j=1;j<5;j++){ tmp&=s[rnk[i][j]][j]; } printf("%d ",tmp.count()); } return 0; }