1. 程式人生 > >[結論] LibreOJ #520. 「LibreOJ β Round #3」緋色 IOI(開端)

[結論] LibreOJ #520. 「LibreOJ β Round #3」緋色 IOI(開端)

題意

戳這裡

題解

這是一道結論題。
我們先把數放到數軸上考慮。定義兩個點的距離為幾何上的距離的平方。
我們可以把一個迴路看作兩條從 1n 的不相交的路徑。
有一種經典的二路取數的 O(n2)DP,但是會 T 掉,且很難進一步優化。
怎麼辦呢?只能觀察性質了,這裡有一個很強的結論:
除了最兩端的 (1,2)(n1,n),其他兩個相鄰的點一定不屬於同一條路徑。
證明如下:
這裡寫圖片描述
顯然有 a2+b2+y2c2+d2+x2,把 x=a+b,y=c+d 帶入即可得到。

知道這個結論就是傻逼題了。
直接連邊:(1,2)(n1,n)(i,i+2)i=1,2,..

.,n2

#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; }