求调
查看原帖
求调
333855
int233楼主2024/7/12 09:56

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;
} 
2024/7/12 09:56
加载中...