[暴力][数学]JZOJ 4665 数列
分析
正解讲题人没讲清楚,只能暴力水过去了
首先这样一个序列必定满足以下要求:
1、(Max-Min)/d-r+l<=k
2、a[i]%d≡a[l]%d
3、不存在相同的项
那么我们直接枚举左右端点,可以减去2、3的枝
然后就过了……
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> using namespace std; const int N=2e5+10; typedef long long ll; int n,k,len,ansl,ansr,rev[N]; int d,a[N],b[N]; bool in[N]; int main() { scanf("%d%d%d",&n,&k,&d); for (int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]+=1e9,b[i]=a[i]; sort(b+1,b+n+1); for (int i=1;i<=n;i++) rev[i]=lower_bound(b+1,b+n+1,a[i])-b; for (int i=1;i<=n;i++) { int mo=a[i]%d,mx=a[i],mn=a[i]; int j; for (j=i;j<=n;j++) if (a[j]%d==mo&&!in[rev[j]]) { mx=max(mx,a[j]);mn=min(mn,a[j]); if ((mx-mn)/d-j+i<=k) if (j-i+1>len) len=j-i+1,ansl=i,ansr=j; in[rev[j]]=1; } else break; for (int k=i;k<j;k++) in[rev[k]]=0; } printf("%d %d",ansl,ansr); }
在日渐沉没的世界里,我发现了你。