[暴力][数学]JZOJ 4665 数列

Description

 

Input

Output

 

Sample Input

6 1 2
4 3 2 8 6 2

Sample Output

3 5
 

Data Constraint

分析

正解讲题人没讲清楚,只能暴力水过去了

首先这样一个序列必定满足以下要求:

1、(Max-Min)/d-r+l<=k

2、a[i]%d≡a[l]%d

3、不存在相同的项

那么我们直接枚举左右端点,可以减去2、3的枝

然后就过了……

#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);
}
View Code

猜你喜欢

转载自www.cnblogs.com/mastervan/p/11130125.html