题解:AT_abc431_f [ABC431F] Almost Sorted 2
题目传送门
思路
双倍经验
唯一的区别就是本题当
题目要求
发现可以用双指针做。直接排序(注意是降序)。我们对于每一个
然后你的样例一错了……
你发现当
即原本答案为
总时间复杂度为
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
const int mod=998244353;
int n,d,a[N],ans=1;
map <int,int> mp;
int qpow(int a,int b){
int ans=1;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod,b>>=1;
}return ans;
}
signed main(){
scanf("%lld%lld",&n,&d);
for(int i=1;i<=n;i++) scanf("%lld",a+i),mp[a[i]]++;
sort(a+1,a+n+1,greater<int>());
for(int l=1,r=1;r<=n;r++){
while(a[l]-d>a[r]) l++;
ans=ans*(r-l+1)%mod;
}
for(auto i:mp)
for(int j=1;j<=i.second;j++) ans=ans*qpow(j,mod-2)%mod;
printf("%lld",ans);
return 0;
}
撒花!