當前位置:
首頁 >
【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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑就永远替代不了电视电脑就永远替代不了
- 下一篇: 【Splay】文艺平衡树(金牌导航 Sp