考场上推正解实在推不出来,于是写了个模拟退火。大样例一直过不去(当时可能参数太垃圾),然后觉得肯定过不了,只交了 20 分暴力。大失败,刚调了个参交了个模拟退火洛谷上跑80,infoj跑88
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <ctime>
using namespace std;
#define int long long
/***** Fast_IO *****/
namespace IO{
#define gc getchar
#define pc putchar
char buc[(1<<21)]; int _=0;
template<class I>
inline I read(I &x){
x=0; I f=1; char c=gc();
while(c<'0'||c>'9'){ if(c=='-'){ f=f*(-1); } c=gc(); }
while(c>='0'&&c<='9'){ x=(x<<1)+(x<<3)+(c^48); c=gc(); }
return x=x*f;
}
template<class I>
inline void write(I x){
if(x==0){ pc('0'); return; }
int tmp=(x<0?(-x):x),cnt=0;
if(x<0){ pc('-'); }
while(tmp){ buc[cnt++]=(tmp%10)+'0'; tmp/=10; }
while(cnt){ pc(buc[--cnt]); }
return;
}
#define out(x) write(x),pc(' ')
#define outn(x) write(x),pc('\n')
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define ROF(i,a,b) for(int i=(a);i>=(b);--i)
#define FORs(i,a,b,s) for(int i=(a);i<=(b);i+=(s))
#define ROFs(i,a,b,s) for(int i=(a);i>=(b);i-=(s))
}using namespace IO;
/***** Fast_IO *****/
#define maxn 1000010
#define SIZE 5010
const int mod = 998244353;
int qpow(int a,int b){
int res=1,tmp=a;
while(b){
if(b&1){
res=(res*tmp)%mod;
} tmp=(tmp*tmp)%mod;
b>>=1;
} return res;
}
int inv(int k){ return qpow(k,mod-2); }
int n;
int a[maxn];
int c[maxn];
int p[maxn];
int check(){
int res=0;
int ba=0;
FOR(i,2,n){ a[i]=a[i-1]+c[i]; }
FOR(i,1,n){
int val=a[i];
ba+=val;
}
ba=(ba);
FOR(i,1,n){
int val=a[i]*n;
res+=(val-ba)*(val-ba);
}
return res/n;
}
int ans=0;
double delta=0.957;
void solve(){
for(double t=1000;t>1e-5;t*=delta){
int resx=((rand()%(n-1))+2);
int resy=((rand()%(n-1))+2);
swap(c[resx],c[resy]);
int now=check();
if(now<ans){ ans=now; }
else if(exp((double)(ans-now)/t)*RAND_MAX<=rand()){ swap(c[resx],c[resy]); }
} return;
}
void sa(){ while((double)clock()/CLOCKS_PER_SEC<=0.947){ solve(); } }
signed main(){
srand(19260817);
// freopen("variance.in","r",stdin);
// freopen("variance.out","w",stdout);
read(n);
if(n==1){ puts("0"); return 0; }
FOR(i,1,n){ read(a[i]); c[i]=a[i]-a[i-1]; }
if(n==2){ outn(check()); return 0; }
ans=0x3f3f3f3f3f3f3f3f;
sa();
outn(ans);
return 0;
}