神奇的二叉树出现往往意味着神奇的性质,这题也不例外
题目悄悄地告诉了我们treap是干什么的,可是我惊奇地发现本题与平衡树的使用没有一点关系
哎,乖乖地动归吧,别乱想,孩子
经验告诉我们,二叉树往往能利用中序遍历序列转化为线性结构
这题就比较明显了,二叉搜索树,摆明了就是一个数据值从小到大的序列嘛,好了,按数据值排好序后做区间型dp想
我不一会儿便想到一个白痴n^3的方程,大概就是f[i,j]表示i到j这一段的最小花费,每次考虑枚举一个为根,再根据权值看把这个点提为根要不要多算花费
十分得意地过了样例,一测,结果可想而知的就是0分 T_T
怎么错了?陷入深深地思考中。首先很容易从心理学的角度判断出我这个算法应该是错的,n^3的方程数据没理由n<=70
科学是严谨的,我究竟怎么错了?再作深入分析
我这样做实际上是考虑了把一个点的权值改 小 ,而实际上我们可以把一个点改小还可以改 大 !
这个的方程完全考虑不到这种情况,错误便在这里!
再感性地想一想,也确实是,有时候是有把一个点提上来没有把另一个点沉下去的好的可能的。
那么,怎么改改方程才能消掉这个后效呢?
增维?没错!就是增维,考虑到权值的后效,我们把权值这一维设进方程就可以了
把权值先离散化掉,记f[i,j,k]表示i到j这一段的子树权值全部>=k的最小花费
那么需要枚举一个u为根,我们可以把u的权值改为k,那u的子树f[i,j,k]=f[i,u-1,k]+f[u+1,j,k]+s[i..j];而如果u的权值本身就>=k啦,
f[i,j,k]就还可以从f[i,u-1,b[i]]+f[u+1,j,b[i]]+s[i..j]转移过来(b[i]就是i的权值)
边界就是f[i,i-1,k]=0,答案就是f[1,n,0]
这个方程还是有一点是需要解释的,可能你也感觉到了,题目不是说要根的权值小于儿子权值吗?你这里是小于等于啊,难道不会萎?
事实确实没有萎,就凭这个方程ac了,怎么理解呢?
题目还说你可以把权值改成任意实数,意思就是你想让哪个点处于哪个位置就可以让它处于哪个位置
那么实际上我们可以看成根的权值改成比k略大一点点,这样就可以了
代码:
一开始意识流地以为如果u点的权值>=k就只有第二种转移了,样例调了半个小时才发现。。