【BZOJ】1564: [NOI2009]二叉查找树
2017-01-20 21:13
218 查看
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1564
Solution
这题数据范围是n≤70
首先,我们很容易看出这是个treap……
(先为看不出的默哀)
将3个值分别记为abc
按a排序后,treap构造只能由连续的一段点构成一棵子树
那么枚举左端点、右端点还有根的位置……
哎呀,怎么转移呢QwQ
发现这东西好像没法处理,那么就再加一维状态强上,表示根的权值不小于某个数
这样就可以通过枚举根的权值、左右端点和根完成转移
考虑价值的维护,首先是对根的权值进行了修改,这种情况在转移时可以处理
那么另一方面就是访问价值了,一个点的访问价值就是它的c叠加深度次。我们子树又是一层层合并的,那么只要每次合并子树的时候把子树内所有点c求个和加进总价值就好(前缀和)
枚举根的权值的时候分两种情况转移,一是修改根的权值,二是不修改
对b做个离散化先(懒得手写快排QwQ)
Solution
这题数据范围是n≤70
首先,我们很容易看出这是个treap……
(先为看不出的默哀)
将3个值分别记为abc
按a排序后,treap构造只能由连续的一段点构成一棵子树
那么枚举左端点、右端点还有根的位置……
哎呀,怎么转移呢QwQ
发现这东西好像没法处理,那么就再加一维状态强上,表示根的权值不小于某个数
这样就可以通过枚举根的权值、左右端点和根完成转移
考虑价值的维护,首先是对根的权值进行了修改,这种情况在转移时可以处理
那么另一方面就是访问价值了,一个点的访问价值就是它的c叠加深度次。我们子树又是一层层合并的,那么只要每次合并子树的时候把子树内所有点c求个和加进总价值就好(前缀和)
枚举根的权值的时候分两种情况转移,一是修改根的权值,二是不修改
对b做个离散化先(懒得手写快排QwQ)
#include<stdio.h> #include<algorithm> #include<cstring> #define For(i,a,b) for (int i=a;i<=b;i++) #define A t[i].a #define B t[i].b #define C t[i].c #define N 75 using namespace std; struct T { int a,b,c; friend bool operator < (T a,T b){return a.a<b.a;} }t ; int st ,S ,f ,n,K; int main() { scanf("%d%d",&n,&K); For(i,1,n) scanf("%d",&A); For(i,1,n) scanf("%d",&B),st[i]=B; For(i,1,n) scanf("%d",&C); sort(t+1,t+n+1);sort(st+1,st+n+1); For(i,1,n) B=lower_bound(st+1,st+n+1,B)-st; For(i,1,n) S[i]=C+S[i-1]; memset(f,0x3f,sizeof(f)); For(i,1,n+1) For(w,0,n) f[i][i-1][w]=0; for (int w=n;w;w--) for (int l=n;l;l--) For(r,l,n) For(i,l,r) { f[l][r][w]=min(f[l][r][w],f[l][i-1][w]+f[i+1][r][w]+K+S[r]-S[l-1]); if (w<=B) f[l][r][w]=min(f[l][r][w],f[l][i-1][B]+f[i+1][r][B]+S[r]-S[l-1]); } int ans=2033333333; For(i,0,n) ans=min(ans,f[1] [i]); printf("%d",ans); }
相关文章推荐
- bzoj 1564: [NOI2009]二叉查找树
- 【树型DP】BZOJ1564 二叉查找树(noi2009)
- bzoj1564: [NOI2009]二叉查找树
- BZOJ 1564: [NOI2009]二叉查找树( dp )
- BZOJ 1564 NOI2009 二叉查找树 动态规划
- [BZOJ1564][NOI2009]二叉查找树(区间DP)
- bzoj 1564 [NOI2009]二叉查找树(树形DP)
- 【BZOJ1564】[NOI2009]二叉查找树【区间DP】
- 1564: [NOI2009]二叉查找树 - BZOJ
- 【DP】BZOJ1564- [NOI2009]二叉查找树(!!)
- [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp
- [BZOJ 1564][NOI 2009]二叉查找树(DP)
- [bzoj1564][NOI2009]二叉查找树
- 1564: [NOI2009]二叉查找树 区间DP
- BZOJ 1562: [NOI2009]变换序列 【二分图匹配】【匈牙利】
- BZOJ1565 [NOI2009]植物大战僵尸 【最大权闭合子图 + tarjan缩点(或拓扑)】
- 【bzoj1562】 NOI2009—变换序列
- bzoj1562【Noi2009】变换序列
- bzoj1566【Noi2009】管道取珠
- 1562: [NOI2009]变换序列 - BZOJ