CodeForces - 757C (反向思维)

xiaoxiao2021-02-28  62

题目链接

本题一开始正面去想,就像是一个集合的操作,极其复杂。但实际上,如果我们倒着想,将每个动物所在的gym都记录下来,如果出现多次,就记录多次。那么我们知道,只要两个动物的出现序列相同,就可以交换。而判断相同时,我们可以用类似后缀数组判断时的思想,将所有序列都排好序,然后只有相邻的序列才有可能相等。这样,只要扫一遍,就可以求出答案。

代码如下:

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e6 + 10; const ll MOD = 1e9 +7; vector<int> cnt[maxn]; ll ans = 1; ll fac(ll n){ int ans = 1; for(ll i = 2;i <= n;i++){ ans = (ans * i) % MOD; } return ans; } int n,m,a,g; int main() { scanf("%d%d",&n,&m); for(int i = 1;i <= n;i++){ scanf("%d",&g); for(int j = 1;j <= g;j++){ scanf("%d",&a); cnt[a].push_back(i); } } sort(cnt + 1,cnt + m + 1); ll temp = 1; for(int i = 2;i <= m;i++){ if(cnt[i] != cnt[i - 1]) { ans = (ans * fac(temp)) % MOD; temp = 1; }else temp++; } ans = (ans * fac(temp)) % MOD; printf("%d\n",ans); return 0; }

转载请注明原文地址: https://www.6miu.com/read-96584.html

最新回复(0)