RT,本人为了给写正解做铺垫,写了一个暴力,结果样例4都没过,我认为是我的算法逻辑有误,希望能有人指出我的错误。
Code:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll n,m,r,bel[100005],sz[100005],wz[100005],b,ret,ans,f[100005],L[100005],R[100005],pows[100005];
struct node{
ll x,id;
}c[100005];
ll cmp(node A,node B){
return A.x<B.x;
}
ll mns(ll l,ll r){
ll mn=1e9;
for(ll i=l;i<=r;i++){
mn=min(mn,c[i].id);
}
return mn;
}
int main(){
cin>>n>>m;
pows[0]=1;
for(ll i=1;i<=n;i++){
cin>>c[i].x;
pows[i]=pows[i-1]*2%mod;
c[i].id=i;
}
sort(c+1,c+n+1,cmp);
for(ll i=1;i<=n;i++){
wz[c[i].id]=i;
}
for(ll i=1;i<=n;i++){
if(i==1){
bel[i]=++r;
sz[r]=1;
L[r]=R[r]=i;
}
else{
if(c[i].x-c[i-1].x<=m){
bel[i]=bel[i-1];
R[bel[i]]=i;
sz[bel[i]]++;
}
else{
bel[i]=++r;
sz[r]=1;
L[r]=R[r]=i;
}
}
}
for(ll i=1;i<=n;i++){
ll t=bel[wz[i]];
ans=1;
ret=0;
if(wz[i]>L[t]&&mns(wz[i]-1,wz[i])==c[wz[i]].id){
ret=1;
}
if(wz[i]<R[t]&&mns(wz[i],wz[i]+1)==c[wz[i]].id){
ret=1;
}
for(ll j=L[t];j<=R[t];j++){
if(j<wz[i]){
if(mns(j,wz[i])==c[j].id){
ret++;
}
}
else if(j>wz[i]){
if(mns(wz[i],j)==c[j].id){
ret++;
}
}
}
ans=pows[sz[t]-ret];
for(ll j=1;j<=bel[n];j++){
if(j==t){
continue;
}
ans=(ans*f[j])%mod;
}
cout<<ans<<" ";
f[t]=(f[t]+pows[sz[t]-ret])%mod;
}
return 0;
}