日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 默认站点!

默认站点

當前位置: 首頁 >

【Splay】波动值之和(金牌导航 Splay-1)

發布時間:2023/12/3 30 豆豆
默认站点 收集整理的這篇文章主要介紹了 【Splay】波动值之和(金牌导航 Splay-1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

波動值之和

金牌導航 Splay-1

題目大意

給出一個數列,求∑i=1nminj=1i?1∣ai?aj∣\sum_{i=1}^{n}min_{j=1}^{i-1}|a_i-a_j|i=1n?minj=1i?1?ai??aj?

輸入樣例

6 5 1 2 5 4 6

輸出樣例

12

樣例解釋

5+∣1?5∣+∣2?1∣+∣5?5∣+∣4?5∣+∣6?5∣=5+4+1+0+1+1=125+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=125+1?5+2?1+5?5+4?5+6?5=5+4+1+0+1+1=12

數據范圍

1?n?32767,∣ai∣?1061\leqslant n \leqslant 32767,|a_i|\leqslant 10^61?n?32767,ai??106

解題思路

用Splay存起來,然后每次找到最接近當前數的數(把當前數旋轉為根節點,然后在左子樹找最大,在右子樹找最小)

代碼

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 40000 using namespace std; int n, x, w, rt, ans, s[N], ls[N], rs[N], fa[N]; int ss(int x) {return x == ls[fa[x]]; } void up(int x) {int y = fa[x], z = fa[y], g = ss(x)? rs[x]: ls[x];if (z) ss(y)? ls[z] = x: rs[z] = x;if (ss(x)) rs[x] = y, ls[y] = g;else ls[x] = y, rs[y] = g;fa[x] = z;fa[y] = x;if (g) fa[g] = y; } void Splay(int x, int y)//旋轉 {while(fa[x] != y){if (fa[fa[x]] != y)ss(x) == ss(fa[x])? up(fa[x]): up(x);up(x);}if (!y) rt = x; } void add(int v)//加點 {int x = rt, y = 0;while(x){y = x;if (v < s[x]) x = ls[x];else x = rs[x];}s[++w] = v;fa[w] = y;if (v < s[y]) ls[y] = w;else rs[y] = w;Splay(w, 0); } int ask()//查詢 {int x = ls[rt], y = rs[rt], xx, yy;//分別查詢左右子樹if (x) while(rs[x]) x = rs[x];//左子樹最大的if (y) while(ls[y]) y = ls[y];xx = s[rt] - s[x];yy = s[y] - s[rt];if (!x) return yy;if (!y) return xx;return min(xx, yy); } int main() {scanf("%d", &n);scanf("%d", &ans);s[++w] = ans;rt = 1; while(--n){scanf("%d", &x);add(x);ans += ask();}printf("%d", ans);return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是默认站点為你收集整理的【Splay】波动值之和(金牌导航 Splay-1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得默认站点網站內容還不錯,歡迎將默认站点推薦給好友。