题意
题解
这是一道结论题。
我们先把数放到数轴上考虑。定义两个点的距离为几何上的距离的平方。
我们可以把一个回路看作两条从
1
到
有一种经典的二路取数的
O(n2)DP
,但是会
T
掉,且很难进一步优化。
怎么办呢?只能观察性质了,这里有一个很强的结论:
除了最两端的
证明如下:
显然有
a2+b2+y2≥c2+d2+x2
,把
x=a+b,y=c+d
带入即可得到。
知道这个结论就是傻逼题了。
直接连边:
(1,2),(n−1,n),(i,i+2)i=1,2,...,n−2
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
typedef long long LL;
int n,a[maxn];
LL ans;
LL sqr(LL x){ return x*x; }
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n);
ans+=sqr(a[1]-a[2])+sqr(a[n-1]-a[n]);
for(int i=1;i<=n-2;i++) ans+=sqr(a[i]-a[i+2]);
printf("%lld\n",ans);
return 0;
}
本文探讨了一种特殊的二路取数问题,通过将数值放置于数轴并定义特定的距离概念,得出一种高效的求解策略。文中提出一个有趣且强有力的结论:除了最两端的点外,其余相邻点不会出现在同一条路径上,并给出了该结论的证明过程。最后,通过具体的C++代码实现了这一策略。
&spm=1001.2101.3001.5002&articleId=77046535&d=1&t=3&u=474b3e0dd6db4969b9166a6ba4528479)
347

被折叠的 条评论
为什么被折叠?



