题目描述:

alt

输入描述:

alt

输出描述:

alt

这是一道思维题,本想着是田忌赛无脑入双指针,但是细细看来里面是有规律的,想要得分高,肯定是要让牌尽量出的多,当苯最小比红最小大的的时候,苯可将所有牌出掉,因为规则是数字大的牌移除并且双方手牌顺序不变,在红最小牌出现的时候即可全部出掉,反之,如果有比红最小的牌还小的牌一定出不掉,因为会被卡住,因此我们要将次作为分界线,找到第一个比最小牌小的出不掉的牌,令这张牌为k,比k大的都出的掉且分数最大(因为我们已经保证自己出的牌最多了,k会被卡住出不掉,更何况比k小的),接下来我们就要找到比k大的个数count,再用总数减去这个数就是出不掉的数n-count,分为左右两种,两边都为全排列即为阶乘,且互相独立,最终将出的掉的全排列X出不掉的全排列就是最终答案,最后不要忘记取模,最好乘一次取一次模。

using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		vector<int> a(n+1);
		vector<int> b(n+1);
		for(int i=1;i<=n;i++) cin>>a[i];
		for(int i=1;i<=n;i++) cin>>b[i];
		sort(b.begin(),b.end());
		int count=0;
		for(int i=1;i<=n;i++){
			if(a[i]>b[1]){
				count++;
			}
		}
		long long sum=1;
		for(int i=1;i<=count;i++){
			sum=sum*i%998244353;
		}
		for(int i=1;i<=n-count;i++){
			sum=sum*i%998244353;
		}
		cout<<sum<<endl;
	}
    return 0;
}