\(\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}\) 建出二叉搜索树的最小深度和,则:

\[f(l,r)=\left(r-l+\sum_{i\in[l,r]}a_i\right)+\min_{p\in[l,r)}\{f(l,p)+f(p+1,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的更多相关文章

  1. Solution -「Gym 102759I」Query On A Tree 17

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...

  2. Solution -「HDU 5498」Tree

    \(\mathcal{Description}\)   link.   给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...

  3. Solution -「Gym 102979E」Expected Distance

    \(\mathcal{Description}\)   Link.   用给定的 \(\{a_{n-1}\},\{c_n\}\) 生成一棵含有 \(n\) 个点的树,其中 \(u\) 连向 \([1, ...

  4. Solution -「Gym 102979L」 Lights On The Road

    \(\mathcal{Description}\)   Link.   给定序列 \(\{w_n\}\),选择 \(i\) 位置的代价为 \(w_i\),要求每个位置要不被选择,要不左右两个位置至少被 ...

  5. Solution -「Gym 102956F」Find the XOR

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...

  6. Solution -「Gym 102956B」Beautiful Sequence Unraveling

    \(\mathcal{Description}\)   Link.   求长度为 \(n\),值域为 \([1,m]\) 的整数序列 \(\lang a_n\rang\) 的个数,满足 \(\not\ ...

  7. Solution -「Gym 102956F」Border Similarity Undertaking

    \(\mathcal{Description}\)   Link.   给定一张 \(n\times m\) 的表格,每个格子上写有一个小写字母.求其中长宽至少为 \(2\),且边界格子上字母相同的矩 ...

  8. Solution -「Gym 102956A」Belarusian State University

    \(\mathcal{Description}\)   Link.   给定两个不超过 \(2^n-1\) 次的多项式 \(A,B\),对于第 \(i\in[0,n)\) 个二进制位,定义任意一个二元 ...

  9. Solution -「ARC 125F」Tree Degree Subset Sum

    \(\mathcal{Description}\)   Link.   给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...

随机推荐

  1. xshell 6 的使用

    1.前言 xshell是用来远程控制云服务器的linux系统的软件,装载window系统里面,可以向发送linux指令, 需要的关键信息:该系统设备的公网ip, 用户名 ,密码 2.软件下载 官网地址 ...

  2. SSRF打内网redis

    0x00 redis基础 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用AN ...

  3. 一键AI着色,黑白老照片画面瞬间鲜活

    很多老照片或者电影受时代技术所限制,只能以黑白形式保存:经过编辑后的黑白视频和图片早已丢失彩色原图,这对于保存者来说都十分遗憾.如何能将单一乏味.陈旧斑驳的黑白照片变成鲜活亮丽的彩色照片,从照片中重新 ...

  4. [流畅的Python]第一章数据模型

    这些来自同一家出版社的动物书 像是计算机科学界一盏盏指路明灯 余幼时 初试读 学浅 以为之晦涩难懂 像是老学究咬文嚼字 现在看起来还有些有趣 其实理工男大多都很有趣 这一章介绍了 怎么样去视线一个带有 ...

  5. Sentry 企业级数据安全解决方案 - Relay PII 和数据清理

    本文档描述了一种我们希望最终对用户隐藏的配置格式.该页面仍然存在的唯一原因是当前 Relay 接受这种格式以替代常规数据清理设置. 以下文档探讨了 Relay 使用和执行的高级数据清理配置的语法和语义 ...

  6. Zookeeper介绍一

    Zookeeper是什么 ZooKeeper是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终,将简单易用的接口和性能高效.功能稳定 ...

  7. Android官方文档翻译 十三 3.1Supporting Different Languages

    Supporting Different Languages 支持不同语言 This class teaches you to 这节课教给你 Create Locale Directories and ...

  8. Api自动生成

    如果经常对接api, 可以自己写一个自动化生成代码,提高效率 只抛出一个思路,暂不提供源码 使用json+字符串处理+生成文件 发送一个请求,返回字符串转换为 Newtonsoft.Json.Linq ...

  9. 【刷题-PAT】A1119 Pre- and Post-order Traversals (30 分)

    1119 Pre- and Post-order Traversals (30 分) Suppose that all the keys in a binary tree are distinct p ...

  10. LINUX系统机器人

    简介 在2016年,国内的软硬件尚不能有效支撑我们制造智能机器人,我们无法有效在Linux进行语音唤醒,只能使用斯坦福大学狮身人面像语音开源项目来进行英文识别我们对RIMA的呼唤,抗干扰性为0,意味着 ...