首页 > 其他分享 >CF1821

CF1821

时间:2024-11-11 14:29:37浏览次数:1  
标签:10 le 位置 序列 CF1821 权值 区间

建议结合独立思考使用本题解。
A 没什么价值略去。

B

有一个序列 \(a\),通过把它的一个子区间进行升序排序生成了 \(b\)。
现在给出 \(a,b\),求出可以通过该操作使 \(a\) 变为 \(b\) 的最长子区间的左右端点,输出任意一个。
\(n\le 2\times 10^5\)

如果存在一个位置,使得 \(a_{p}\neq b_{p}\),那么答案一定包含这个位置,则只需贪心地在 \(b\) 中找包含它的极长不降子区间即可。
否则我们需要找出 \(a=b\),我们需要找出序列的极长不降子区间,扫一遍分段即可。
代码

C

有一个小写字母字符串,每次操作可以选择其中不相邻的一些位置删除,然后把剩余的部分进行拼接。
求使得字符串的所有字符相同的最小操作次数。
\(n\le 2\times 10^5\)

不妨考虑在已知剩余的字母 \(c\) 的前提下进行考虑:
发现一定不会操作所有 \(c\),加入它们是不优的。
同时发现删除一个连续段需要的操作次数是 \(\lfloor \log_{2}(len) \rfloor+1\),而答案为该字符把原串分成的所有连续段所需的操作次数的最大值。
故只需最小化最大连续段长,枚举每个位置,考虑该位置字符与上一次出现的间隔进行更新即可。
代码

D

有 n 个不连续(指 \(r_i<l_{i+1}-1\))区间,现在要进行选取 k 不同的位置,要求这些位置都在某个区间内。
若最大一个选取位置为 \(p_r\) 位置构成的连续段个数为 \(cnt\),则权值为 \(p_r+2cnt\),最小化权值。
\(n\le 10^5,1\le l_i\le r_i\le 10^9,k\le 10^9\)

一种方案是贪心地选取前缀,此时最小化了 \(p_{r}\)。
发现如果要除了最后一个,一个区间要么填满要么不填,那么发现前缀中只有长度为 1 的区间不填可能更优。
那么枚举前缀贪心地,记一下长度 1 的区间个数即可。
代码

E

给定一个合法括号序列。
定义一个合法括号序列的权值为,不断地删除某两个相邻的左右括号,将代价加上原右括号右边的括号数量,最后把清空序列所需的最小代价。
可以进行不超过 k 次操作,每次选取一个括号移动到另一个位置,要求每一次操作后仍然是合法括号序列。
最小化得到的合法操作序列的权值最小值。
\(n\le 10^5,0\le k\le 10^9\)

(PS:原题 \(k\le 5\))
如果把括号序列的树型结构建出来的话,答案就是 \(\sum\limits dep_{u}-n\),按照后序删除即可。
这个数值同时等于 \(\sum\limits sz_{u}-n\)。
考虑一次操作,发现最优一定是选择一个最大的子树,把它拆掉。
于是把子树大小拍成序列,求前 \(k\) 大和即可。
代码

F

Luogu
给定一个数轴,在其上一些位置种共 m 棵树,满足:
只在整点位置种树,不存在两个树占用同点。
每棵树可以向左右中一个方向倒下,占用长度为 \(k+1\) 的区间(即 \([x,x-k]\) 或 \([x,x+k]\)),要求存在一种方案使得倒下占用的位置都在 \([1,n]\) 内,且无重叠。
求合法树位置序列个数。
\(n,m,k\le 10^5\)

思路解析

建立双射,写出转移。
从各个角度考虑优化和转化。

预处理

考虑让每棵树贪心地向左倒,如果不能向左再向右,然后来考虑树倒下占用位置的情况进行计数。
(本质上是构建了二者间的 双射

如果一个区间和上一个间距不够大,则可以有 2 的方案数(因为该区间可以是由左端点位置的树或是右端点位置的树生成),否则方案数为 1,故列出转移式:
\(f_{i,j}=2\sum\limits_{t=0}^{k-1}f_{i-1,j-k-t}+\sum\limits_{t=k}^{j}f_{i-1,j-k-t}\)。
直接前缀和优化可做到 \(\mathcal O(n^{2})\)。

生成函数

注意到第一维这里很明显有层(指转移式与 \(i\) 无关)的概念,故对第二维构造生成函数。
每层转移相同,把转移式写作刷表的形式可以发现是卷积的形式,用多项式快速幂即可做到 \(\mathcal O(n\log n)\)。
如果你对生成函数继续推导甚至可以得到 \(\mathcal O(n)\) 的式子,但这里不作重点展开。

容斥

从另一个角度看,可以是看成决策 m 个结束位置,要求任意两个位置之间距离 \(>k\),之后每有距离 \(\leq 2k\) 乘上一个 2 的系数。
故考虑做 \(f_{i}\) 表示恰好若干个距离 \(>2k\) 的方案数,答案就是 \(\sum\limits_{i=0}^{m} 2^{m-i}f_{i}\)。
这样我们就可以把这些方案减去并隔板,那么钦定有 \(i\) 个距离 \(>2k\) 的方案数有 \(g_{i}=\binom{m}{i}\binom{n-mk-ik}{m}\)。
用二项式反演再推推式子就可以做到 \(\mathcal O(n)\)。

网格图

考虑之前的转移式,由于有层的概念,并且转移范围和系数都是常数,所以可以把问题映射到网格图上的路径权值和计数问题。
直接做图是这样的:
![[Pasted image 20241111133950.png]]
这样边的种类太多了,考虑进行变换。
注意到上面的 dp 式子是区间转移的形式,那么我们可以考虑变为单点转移。
\(f_{i,j}=f_{i-1,j}+(2f_{i-k-1,j-1}-f_{i-2k-1,j-1})\)。
这个式子的含义是在 \([i-k,i]\) 放置区间时,要容斥掉所有只在足够远的距离上放区间的贡献。
于是我们有了新图,把每一行都做平移可以得到:
![[Pasted image 20241107195907.png]]
其中红边权值为 1,黑边权值为 2,黄边权值为 -1,注意第 0 层也有红边,图是错的,那么答案就是 \((0,0)\) 到 \((n-m(k+1),m)\) 的所有路径权值积之和。
枚举黄边经过次数,然后发现式子就和上面的二项式反演后的结果是一样的了。

代码

标签:10,le,位置,序列,CF1821,权值,区间
From: https://www.cnblogs.com/Sugar-Cube/p/18539636

相关文章

  • CF1821F Timber 题解
    题意:在\([1,n]\)的区间里放\(m\)棵树,每棵树的高度为\(k\)。求有多少种放置树的方法,满足:每个树都在整点上,且每个点最多只能放一棵树。存在一种砍倒树的方案,使得树倒了之后不会越界,也不会有某个点被超过一棵树占据。你可以自由选择树向左倒(也就是占据区间\([x-k,x]\))......
  • 【题解】Educational Codeforces Round 147(CF1821)
    自己做出来了A-E,F算是搞懂GF后第一道符合我这个菜鸡水平的实战,可惜的是根本没意识到可以GF。A.Matching题目描述:整数模板是每位均为数字或问号的字符串。如果可以用数字替换模板中的每个问号,从而获得该正整数(严格大于\(0\))的十进制表示形式,且不带任何前导零,则该正整数......
  • CF1821F Timber
    考虑如何判断一个方案是合法的,很容易想到贪心,从左到右考虑第\(i\)棵树:如果这棵树能向左倒即\([x_i-k,x_i]\)没有被占据,就向左倒。否则向右倒。显然向左倒对之前已经倒下的树没有影响,而对后面的树来讲,这棵树向左倒能留下尽量多的空间,所以优先向左倒一定不劣。所以考虑一......