思路:
用bitset判断交集个数
代码:
#includeusing 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 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\n",tmp.count()); } return 0;}
参考: