PermutationForces II (题目意思的理解,贪心,组合数(计数问题 ))

发布时间 2023-04-17 10:31:25作者: VxiaohuanV

 

 

题解:

  • 认真读题, 理解题目意思,然后提取关键性质
  • 发现性质: 只要遇到 没有在b中出现的值, 都有余力可以去吧他往后面交换 , 然后在 -1的时候就有这么多的选择了
  • 组合数而已, 用过这个数就--
  •  
#include<cstdio>
#include<iostream>
#define MAXN 200000
#define MOD 998244353
using namespace std;

int a[MAXN+5],b[MAXN+5],c[MAXN+5],d[MAXN+5];
bool vis[MAXN+5];

int main() {
    ios::sync_with_stdio(0);
    int t,n,s,cnt,p;
    bool flag;
    long long ans;
    cin>>t;
    while (t--) {
        ans=1;cnt=0;flag=0;p=0;
        cin>>n>>s;
        for (int i=1;i<=n;++i) d[i]=-1,vis[i]=0;
        for (int i=1;i<=n;++i) cin>>a[i],c[a[i]]=i;
        for (int i=1;i<=n;++i) cin>>b[i];
        for (int i=1;i<=n;++i) if (b[i]!=-1) d[b[i]]=i,vis[i]=1;
        for (int i=1;i<=n;++i) if (a[d[i]]-i>s) flag=1;
        if (flag==1) {
            cout<<"0\n";
            continue;
        }
        for (int i=1;i<=n;++i) {
            while (p<i+s&&p<n) {++p;if (!vis[c[p]]) ++cnt;}
            if (d[i]==-1) {
                ans=(ans*cnt)%MOD;
                --cnt;
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
}
View Code