PermutationForces II (题目意思的理解,贪心,组合数(计数问题 ))
题解:
- 认真读题, 理解题目意思,然后提取关键性质
- 发现性质: 只要遇到 没有在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; }