Solution -「Gym 102798K」Tree Tweaking
\(\mathcal{Description}\)
Link.
给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树时结点深度之和的最小值。
\(n\le10^5\),\(r-l+1\le200\)。
\(\mathcal{Solution}\)
先把不作修改的二叉搜索树建出来——按值升序遍历,单调栈维护即可,这就相当于建 \((p_i,i)\) 的笛卡尔树。考虑此时树上一个“可修改连通块”的性质:它的“不可修改子树”的父亲和子树大小是一定的,无论这棵子树内部如何作修改。这提示我们可以独立地考虑每个“可修改连通块”。首先遍历得到连通块邻接的子树大小(若有空儿子,增加一个大小为 \(0\) 的子树,用于占位),得到序列 \(a_{1..k}\),则在其上 DP,令 \(f(l,r)\) 表示将 \(a_{l..r}\) 建出二叉搜索树的最小深度和,则:
\]
所以 \(\mathcal O((r-l+1)^3)\) 求出所有 \(f\),求和就能得到答案。复杂度 \(\mathcal O(n+(r-l+1)^3)\)。
\(\mathcal{Code}\)
/*~Rainybunny~*/
#include <cstdio>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
typedef long long LL;
inline void chkmin( LL& a, const LL b ) { b < a && ( a = b ); }
const int MAXN = 1e5, MAXK = 200;
int n, a[MAXN + 5], b[MAXN + 5], L, R;
int top, stk[MAXN + 5], ch[MAXN + 5][2], siz[MAXN + 5];
int idx, val[MAXK + 5];
LL f[MAXK + 5][MAXK + 5], sum[MAXK + 5];
inline void collect( const int u ) {
if ( !u || b[u] > R ) return void( val[++idx] = siz[u] );
collect( ch[u][0] ), collect( ch[u][1] );
}
inline LL solve( const int u ) {
idx = 0, collect( u );
rep ( i, 1, idx ) sum[i] = sum[i - 1] + val[i];
rep ( len, 2, idx ) {
for ( int l = 1, r; ( r = l + len - 1 ) <= idx; ++l ) {
LL& cur = f[l][r] = 1ll << 60;
rep ( k, l, r - 1 ) {
chkmin( cur, f[l][k] + f[k + 1][r] );
}
cur += sum[r] - sum[l - 1] + r - l;
}
}
return f[1][idx];
}
int main() {
scanf( "%d", &n );
rep ( i, 1, n ) scanf( "%d", &a[i] ), b[a[i]] = i;
scanf( "%d %d", &L, &R );
rep ( i, 1, n ) {
while ( top && b[i] < b[stk[top]] ) ch[i][0] = stk[top--];
if ( top ) ch[stk[top]][1] = i;
stk[++top] = i;
}
per ( i, n, 1 ) siz[a[i]] = siz[ch[a[i]][0]] + siz[ch[a[i]][1]] + 1;
LL ans = L == 1 ? solve( a[1] ) : 0;
rep ( i, 1, n ) if ( b[i] < L || R < b[i] ) {
ans += siz[i];
if ( L <= b[ch[i][0]] && b[ch[i][0]] <= R ) ans += solve( ch[i][0] );
if ( L <= b[ch[i][1]] && b[ch[i][1]] <= R ) ans += solve( ch[i][1] );
}
printf( "%lld\n", ans );
return 0;
}
Solution -「Gym 102798K」Tree Tweaking的更多相关文章
- Solution -「Gym 102759I」Query On A Tree 17
\(\mathcal{Description}\) Link. 给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...
- Solution -「HDU 5498」Tree
\(\mathcal{Description}\) link. 给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...
- Solution -「Gym 102979E」Expected Distance
\(\mathcal{Description}\) Link. 用给定的 \(\{a_{n-1}\},\{c_n\}\) 生成一棵含有 \(n\) 个点的树,其中 \(u\) 连向 \([1, ...
- Solution -「Gym 102979L」 Lights On The Road
\(\mathcal{Description}\) Link. 给定序列 \(\{w_n\}\),选择 \(i\) 位置的代价为 \(w_i\),要求每个位置要不被选择,要不左右两个位置至少被 ...
- Solution -「Gym 102956F」Find the XOR
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...
- Solution -「Gym 102956B」Beautiful Sequence Unraveling
\(\mathcal{Description}\) Link. 求长度为 \(n\),值域为 \([1,m]\) 的整数序列 \(\lang a_n\rang\) 的个数,满足 \(\not\ ...
- Solution -「Gym 102956F」Border Similarity Undertaking
\(\mathcal{Description}\) Link. 给定一张 \(n\times m\) 的表格,每个格子上写有一个小写字母.求其中长宽至少为 \(2\),且边界格子上字母相同的矩 ...
- Solution -「Gym 102956A」Belarusian State University
\(\mathcal{Description}\) Link. 给定两个不超过 \(2^n-1\) 次的多项式 \(A,B\),对于第 \(i\in[0,n)\) 个二进制位,定义任意一个二元 ...
- Solution -「ARC 125F」Tree Degree Subset Sum
\(\mathcal{Description}\) Link. 给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...
随机推荐
- 解决MySQL服务器禁止远程连接的问题
1. 改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 " ...
- 几张图解释明白 Kubernetes Ingress
来源:K8s技术圈 作者:阳明 Kubernetes Ingress 只是 Kubernetes 中的一个普通资源对象,需要一个对应的 Ingress 控制器来解析 Ingress 的规则,暴露服务到 ...
- [.Net]使用ABP 数据库迁移migration遇到的坑及解决方案
问题:在使用Update-Database时,突然出现"数据库中已存在名为 'XXX' 的对象". 检查发现__EFMigrationsHistory表中的MigrationI ...
- 使用.NET 6开发TodoList应用(填坑1)——实现当前登录用户获取
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在前面的文章里使用.NET 6开发TodoList应用(5)--领域实体创建,我们留了一个坑还没有填上,就是在数据库保存的时候 ...
- 白嫖党的福音!!!全新的Java300集视频(2022版)来了!
它来了它来了,经过一年时间的沉淀, [尚学堂]高淇Java300集完整版正式发布啦! 应广大网友和尚学堂忠实的孜孜学子以及听众朋友的要求,尚学堂在去年十月份就把预计在2022年发布的Java300集提 ...
- 【记录一个问题】thanos receiver在tsdb切换期间,导致remote write接口失败增加
如图:配置了thanos receiver落盘的时间周期为10分钟,结果导致在切换tsdb期间,remote write接口的失败率增高. 目前看来,解决办法就是上游增加重试.
- 从SQL Server数据库导出SQL语句
不同于直接 备份/恢复 或者 导入/导出 数据库操作. 新版本SQL Server客户端中还可以生成相对应的SQL语句. 非常方便与查看和与其他人共享. 连接上数据库后, 右击数据库, 选择 Gene ...
- 一份尽可能全面的Go channel介绍
写在前面 针对目前网络上Go channel知识点较为分散(很难有单独的一份资料把所有知识点都囊括进来)的情况,在下斗胆站在巨人的肩膀上,总结了前辈的工作,并加入了自己的理解,形成了这篇文章.本文类似 ...
- vivo 评论中台的流量及数据隔离实践
一.背景 vivo评论中台通过提供评论发表.点赞.举报.自定义评论排序等通用能力,帮助前台业务快速搭建评论功能并提供评论运营能力,避免了前台业务的重复建设和数据孤岛问题.目前已有vivo短视频.viv ...
- 2020-9-29 T3
题意:给定一颗大小为 \(n(n \le 5 \times 10 ^ 4)\) 的树,保证树的生成方式随机,你需要选定两个点 \(x, y\),最小化: \[\sum\limits_{i = 1} ^ ...