此题能用分治做吗
查看原帖
此题能用分治做吗
590600
Kreado楼主2023/11/16 20:15

RT,过不了

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int Maxn=4e6+114,V=2e6+7;
int n,a[Maxn],k,b[Maxn],ans;

int solve(int l,int r){
	if(l==r) return 1+b[a[l]+k];
	int mid=l+r>>1,lft=0,rgt=0,xml=0,xmr=0;
	for(int i=mid;i>=l;--i) lft=max(lft,xml+=!(a[i]^a[mid])-!(a[i]^(a[mid]+k)));
	for(int i=mid+1;i<=r;++i) rgt=max(rgt,xmr+=!(a[i]^a[mid])-!(a[i]^(a[mid]+k)));
	return max(lft+rgt+b[a[mid]+k],max(solve(l,mid),solve(mid+1,r)));
}

int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]),a[i]+=V,b[a[i]]++,ans=max(ans,b[a[i]]);
	if(k==0) return printf("%d",ans),0;
	printf("%d",max(ans,solve(1,n)));
	return 0;
}
2023/11/16 20:15
加载中...