[题解]GarsiaWachs算法
[做法] GarsiaWachs算法
*更多内容及证明见后文
- 找到满足
q_{k-1} \lt q_{k+1} 的最小下标k - 找到满足
q_{j-1} \gt q_{k-1} + q_k 的最大j \lt k - 从列表中清除
q_{k-1}, q_k - 在
q_{j-1} 之后插入q_{k-1} + q_k -
例:
186 | 64 | 35 | 32 | 103 | 3 | 1 | ||
186 | 67 | 64 | 103 | 2 | 1 | |||
186 | 131 | 103 | 2 | -1 | ||||
234 | 186 | 1 | -1 | |||||
420 |
代码实现: 通过
因为删除我太菜了
#include <bits/stdc++.h>//懒
using namespace std;
int n, k, j;
int ans, sum;
vector<int> v;
int read()
{
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int main()
{
n = read();
v.push_back(INT_MAX - 1);
for (int i = 1; i <= n; i++)
v.push_back(read());
v.push_back(INT_MAX);
while (n-- > 1)
{
for (k = 1; k <= n; k++)
if (v[k - 1] < v[k + 1])
break;
sum = v[k] + v[k - 1];
for (j = k - 1; j >= 0; j--)
if (v[j] > v[k] + v[k - 1])
break;
v.erase(v.begin() + k - 1);
v.erase(v.begin() + k - 1);
v.insert(v.begin() + j + 1, sum);
ans += sum;
}
printf("%d", ans);
return 0;
}
加西亚-瓦克斯(GarsiaWachs)算法.
这种算法是基于最优二叉树提出的,有一个概念叫做
二叉树中预期比较次数
根节点的
二叉查找树中给定几个概率值,
上述公式叫 树的成本,预期比较次数为
外节点:
内节点:
二者的和就是这个树的成本
加西亚瓦克斯算法就是上述树的成本中,
引理一,最优二叉树的转化
如果
如果
证明方法,看一个二叉树的剪裁
不妨设
那么树的形状一定如上图所示,
这个时候如果按照图中的方式剪裁,两条线中的部分裁掉
让左子节点
使得
不妨设
因为我们假定
这样裁剪之后,总的权值变化包括
1)
2)
3)
如果
另外,如果
-
q_{k-1} \le q_{k+1} - 对于
j \le i \lt k-1,q_i \lt q_{k-1} + q_k -
q_{j-1} \ge q_{k-1} + q_k
于是,存在一颗满足
其次,我们关注树的层次,如下图所示
先看如图所示的三层结构,对于满足
如果
旋转之后,
再看最后一个部分,如果
如果旋转二叉树,让
所得到的概率
于是,
排列方式
更优
这就很简单了,根据引理二,如果是
如果是
上升一个高度,实际上就是在
在
引理四
任何一个排列方式如引理三所述的树,都可以转化成为
成本相同,叶子排列顺序为
-
如果
j=k-1 ,显然成立 -
如果不相等,因为
q_{j-1} \ge q_{k-1} + q_k \gt q_j (引理二条件)0,\ldots,j-1,k-1,k,j,\ldots,k-2,k+1,\ldots,n ↑ ↑ j k - 1
q'$ 的下标表示如上所示,所以对于 $j \le i \le k-1$,有 $q_{i-1}' \gt q_{i+1}' 于是根据引理,有
l_x \le l_j \le \ldots \le l_{k-2} ,其中l_x 是x 的级别,并且对于
j \le i \lt k-1 ,l_i 是i 的级别 $i,\ldots,k-2,x$ 替换序列 $x,i,\ldots,k-2 $l$ 是节点 $(k-1,k)$ 的公共级别,使得 $l \le l_{s+1}\le \ldots\le l_{k-2}$,最后可以通过循环位移操作,使得 $k-1,k,s+1,\ldots,k+2$ 变成 $s+1,\ldots,k-2,k-1,k 有看不懂的别找我这个\LaTeX 快敲死我了终