震惊,某暴搜算法竟然能过 NOIP T3
查看原帖
震惊,某暴搜算法竟然能过 NOIP T3
125454
CLCA_楼主2021/11/30 20:23
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
#define N 10005
int n, a[N], b[N], u[N], c[N], d[N], w[N], T = 0;
typedef long long LL;
LL ans = 0x7fffffffffffffffLL;
void dfs(int flr,int l,int r,int sum,int S,int ls,int rs){
	if(flr > T){ans = min(ans, 1LL * sum * n - 1LL * S * S);return ;}
	rep(i, 1, d[flr])ls += c[flr], u[l++] = c[flr], sum += ls * ls, S += ls;
	dfs(flr + 1, l, r, sum, S, ls, rs);
	rep(i, 1, d[flr]){
		sum += (a[n] - rs) * (a[n] - rs), S += a[n] - rs, u[r--] = c[flr], rs += c[flr];
		S -= ls, sum -= ls * ls, l--, ls -= c[flr];
		dfs(flr + 1, l, r, sum, S, ls, rs);
	}
}
int main(){
	scanf("%d", &n);
	rep(i, 1, n)scanf("%d", &a[i]);
	rep(i, 1, n - 1)b[i] = a[i + 1] - a[i];
	sort(b + 1, b + n);
	reverse(b + 1, b + n);
	rep(i, 1, n - 1)if(i == 1 || b[i] != b[i - 1]){
		c[++T] = b[i], d[T] = 1;
	}
	else d[T]++;
	dfs(1, 1, n - 1, a[1] * a[1], a[1], a[1], 0);
	printf("%lld\n", ans);
	return 0;
}
2021/11/30 20:23
加载中...