B
个砖块,每个重量 ,进行以下操作:选择一个还未被移除的砖块并移除,代价是其和与其相邻的砖块的重量之和,定义两块砖 相邻当且仅当 , 没有被移除。共有 种移除的顺序,对于所有顺序计算移除所有 块砖块的代价并计算和
这个可以用草率的方法,这里记录以下笛卡尔树做法
针对这种所有方案之和的有
每次删除一个位置并两边分开做,与笛卡尔树的建树方法类似。计算每个点的删除时间,删除一个点就在使其做根,然后两边接过来,发现形成一个笛卡尔树,其中下标满足
一个位置的贡献就是其在笛卡尔树上的点深度,即,到根路径上点的个数,
转化为如何求随机排列构成的笛卡尔树的期望深度:
考虑到笛卡尔树的结构,若
也就是求:对于随机排列,区间
先选择
1 | const int N=1e5+100; |
C
给出
边的有向完全图,每个点右两个点权 ,一条边的边权值为 ,求边权和最小的哈密顿回路的边权和
一个合法的解一定是有
考虑所有能形成环的方式中可能是最优解的情况:
对所有点都选
对某些点
,同时使用了此时,贪心选择权值小的边
先将所有
混在一起排序,对前 个求前缀和,考虑每个点 ,当 都选时最小权值和( )是否更优
如此更新答案即可
1 | const int N=1e5+100; |
D
圆周上均匀分布
个点,将这些点两两配对成 个无序对,对于每个无序对 ,做连接 的弦。 对于一种配对方式,定义其连通性为 条弦构成的等价连通块数,两条线属于一个等价连通块当且仅当它们相交或存在另一条弦与它们都连通。现在已有 个点完成配对,求剩下的点构成的所有配对方式的连通性之和
这里有一个很好玩的转化:把圆的半径视作
考虑一类连通块
枚举
首先,连通块
设
易知
由于
考虑连通块问题的经典容斥,枚举
而最终答案就是统计每个连通块,其余点任意连边:
1 | const int N=310; |
E
给定一个
的排列 ,以长度为 的 串 表示划分方案, 时分入序列 , 时分入序列 ,使 的前缀最大值个数相等,求 使字典序最小
先贪心,从前往后对于每一位尽量填
有性质:对于序列
由此有结论:对于一个时刻的序列
由此,考虑如何检验:
假设
合法情况当且仅当
右边显然是一个定值,考虑
给
将检验转化为,对于
假设能得到权值为
所以分别求出奇偶情况的最大值并与右式比大小即可
如此,转化为求每个点向后的带权
1 | const int N=2e5+100; |
F
给定
的网格图,每个图有权值 ,定义格子 可以到达 当且仅当存在路径 ,且对于路线上任意点权值 ,且 在 的右下方,求对于所有合法的 ,
显然是 考虑暴力:
以
预处理
若
那么,当遇到格子
每个格子至多被
然后en卡常
1 | const int N=1500+100; |
1 | const int N=1500+100; |
Related Issues not found
Please contact @noone40404 to initialize the comment