牛客练习赛11 E :求最值

题目传送门
分治思想
代码:

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

typedef long long ll;
const int maxn=100000+100;

struct Node{

    ll id,sum;
}node[maxn];
int tmp[maxn];

inline bool cmp(int a,int b){

    return node[a].sum<node[b].sum;
}

inline ll dis(int i,int j){

    return (node[i].id-node[j].id)*(node[i].id-node[j].id)+(node[i].sum-node[j].sum)*(node[i].sum-node[j].sum);
}

ll kaven(int l,int r){

    if(l==r) return 1e18;
    if(l+1==r) return dis(l,r);
    int mid=(l+r)>>1;
    ll Min=min(kaven(l,mid),kaven(mid+1,r));
    int tot=0;
    for(int i=l;i<=r;i++) if((ll)(i-mid)*(i-mid)<Min) tmp[tot++]=i;
    sort(tmp,tmp+tot,cmp);
    for(int i=0;i<tot;i++){

        for(int j=i+1;j<tot && (node[tmp[i]].sum-node[tmp[j]].sum)*(node[tmp[i]].sum-node[tmp[j]].sum)<Min;j++){

            Min=min(Min,dis(tmp[i],tmp[j]));
        }
    }
    return Min;
}

int main(){

    int n;
    scanf("%d",&n);
    node[0].sum=0;
    for(int i=1;i<=n;i++) scanf("%lld",&node[i].sum),node[i].sum+=node[i-1].sum,node[i].id=i; 
    printf("%lld\n",kaven(1,n)); 
}

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/81367396