【平衡规划】Arithmetic Operations(CF1654E)
生活随笔
收集整理的這篇文章主要介紹了
【平衡规划】Arithmetic Operations(CF1654E)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
CF1654E
luogu
正題
給你一個正整數序列,你可以讓一個位置變成任意整數,問你最少修改多少個數,能使得其成為等差序列
解題思路
考慮根號分治
對于公差小于 n\sqrt{n}n? 的,直接枚舉公差,然后枚舉所有點,計算首項
對于公差大于 n\sqrt{n}n? 的,由初始序列保留下來的點相差不大于 n\sqrt{n}n?,所以枚舉每個點,然后遍歷后面的 n\sqrt{n}n? 個點,計算公差
code
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 100100 using namespace std; int n,m,ans,a[N],s[N*640]; int main() {scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d",&a[i]);m=320;for(int i=0;i<=m;++i){for(int j=1;j<=n;++j)ans=max(ans,++s[a[j]-i*j+n*i]);for(int j=1;j<=n;++j)s[a[j]-i*j+n*i]--;}for(int i=1;i<=m;++i){for(int j=1;j<=n;++j)ans=max(ans,++s[a[j]+i*j]);for(int j=1;j<=n;++j)s[a[j]+i*j]--;}for(int i=1;i<=n;++i){for(int j=1;j<=100000/m&&i+j<=n;++j)if((a[i+j]-a[i])%j==0)ans=max(ans,++s[(a[i+j]-a[i])/j+100000]+1);for(int j=1;j<=100000/m&&i+j<=n;++j)if((a[i+j]-a[i])%j==0)s[(a[i+j]-a[i])/j+100000]--;}printf("%d",n-ans);return 0; }總結
以上是生活随笔為你收集整理的【平衡规划】Arithmetic Operations(CF1654E)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【DP】Mod Mod Mod(CF88
- 下一篇: 【状压DP】滚榜(P7519)