1. 程式人生 > 其它 >E. Arithmetic Operations 題解(分類討論)

E. Arithmetic Operations 題解(分類討論)

題目連結

題目思路

看一眼資料範圍和時間限制,很容易想到複雜度為\(O(n\sqrt n)\)

有點不太會寫,要採用按照公差大小分類討論

假如公差小於\(\sqrt {10^5}\)

那麼直接暴力計算\(a[i]=a[i]-(i-1)*d\) 判斷哪個數出現的次數最多即可

假如公差大於\(\sqrt{10^5}\)

那麼以\(a[i]\)為起點,長度最多\(\sqrt{10^5}\)

程式碼

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e8+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n;
int a[100000+5];
int c=320,yi=5e7;
int cnt[maxn];
signed main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    int ma=0;
    for(int i=-c;i<=c;i++){
        for(int j=1;j<=n;j++){
            cnt[a[j]+(j-1)*i+yi]++;
            ma=max(ma,cnt[a[j]+(j-1)*i+yi]);
        }
        for(int j=1;j<=n;j++){
            cnt[a[j]+(j-1)*i+yi]=0;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=min(n,i+c);j++){
            if((a[j]-a[i])%(j-i)!=0) continue;
            cnt[(a[j]-a[i])/(j-i)+yi]++;
            ma=max(ma,cnt[(a[j]-a[i])/(j-i)+yi]+1);
        }
         for(int j=i+1;j<=min(n,i+c);j++){
            if((a[j]-a[i])%(j-i)!=0) continue;
            cnt[(a[j]-a[i])/(j-i)+yi]=0;
        }
    }
    printf("%d\n",n-ma);
    return 0;
}