一道sb题..被我化到了暴力一栏
做法也很简单,考虑插入法。
先给积木从大到小排序,然后枚举挨个放。
假设枚举到第r个积木,1…r-1全都放完有ans种方法,再把积木r插入
显然放在最顶上算一种方法,然后还可以放在某些积木的下面的位置,由于已经排好序,直接照着上一次的位置向前找,这样复杂度为线性
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#define R 998244353
using namespace std;
int sc()
{
int i=0; char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i;
}
int a[777777];
int n,d;
long long ans=1;
bool cmp(int a,int b){return a>b;}
int main()
{
n=sc(),d=sc();
for(int i=1;i<=n;i++)a[i]=sc();
sort(a+1,a+n+1,cmp);
for(int l=1,r=2;r<=n;r++)
{
while(a[l]-a[r]>d)l++;
ans=ans*(r-l+1)%R;
}
cout<<ans;
return 0;
}