首页 > 其他分享 >Atcoder试题乱做 Part2

Atcoder试题乱做 Part2

时间:2022-09-26 21:35:20浏览次数:72  
标签:Atcoder frac 试题 limits text sum Part2 Delta 长度

感受下来, 思维难度有参差, 所以还是可以做的, 虽然有的题和中国赛题差距有点大, 但是无伤大雅?

新的 \(\text{Part}\) 我要自己做出来更多题!


\(\text{[AGC014D]Black and White Tree}\)

\(\color{green}{\text{[EASY]}}\)

发现点一个叶子结点的父亲变白点, 那这个叶子就一定要点黑点, 然后这两个点就对其他的部分不造成影响了, 可以删掉, 所以如果一个点有两个叶子结点儿子, 那么直接就是先手胜利.


\(\text{[AGC004F]Namori}\)

\(\color{blue}{\text{[NORMAL]}}\)

树的话是, 经典套路奇偶层染色, 变成交换草走. 那么就可以考虑一个子树里面需要移进多少, 移出多少, 分值为 \(1,-1\) , 那么就可以定义 \(a_i\) 为这个子树内值的和. 显然根不为 \(0\) 无解, 答案下界为 \(\sum\limits_{i=1}^{n}{|a_i|}\) , 不难构造这就是最优答案.

接着考虑基环树, 偶环的时候考虑环边是 \(u \rightarrow v\) , 假定这个边会操作 \(x\) 次, 那么一边的父亲操作会多 \(x\) 次, 另一边少 \(x\) 次, 断掉这个边之后按树跑出 \(a_i\) , 答案即为:

\[\sum_{i\in left}{|a_i-x|}+\sum_{i\in right}{|-a_i-x|}+|-x| \]

就是求解中位数.

如果是奇环, 那么那个环边就可以让黑点数量 \(+2\) 或者 \(-2\) , 所以只要黑点白点数量差为偶数, 就一定可以通过调和来让整张图有解.

直接给答案和那条环边的两个点加上全图黑点与白点的差除以 \(2\) , 然后按树的做法即可.


\(\text{[AGC028D]Chords}\)

\(\color{green}{\text{[EASY]}}\)

令 \(n=2N\) , 这个圆看成序列也是一样的, 如果 \([l_1,r_1]\) 和 \([l_2,r_2]\) 相交但不包含, 就在一个连通块.

考虑计算每个连通块对答案的贡献次数. 令 \(f_{i,j}\) 表示区间 \([i,j]\) 任意连边, 且 \(i\) 和 \(j\) 在同一个连通块内的方案数.

枚举这样的区间, 区间长度一定是偶数, 设 \(g_{x}\) 表示 \(x\) 个点的环任意连边的方案数, \(c_{i,j}\) 表示 \([i,j]\) 内还没确定连边情况的点的个数.

转移为 \(f_{i,j}=g_{c_{i,j}}-\sum\limits_{k=i+1}^{j-1}{f_{i,k}g_{c_{k+1,j}}}\) , 答案为 \(\sum{f_{i,j}g_{n-2k-c_{i,j}}}\) , 时间复杂度 \(\mathcal{O}(n^3)\) .


\(\text{[AGC007E]Shik and Travel}\)

\(\color{green}{\text{[EASY]}}\)

比较简单的一道题.

显然可以二分, 一条边恰好经过两次, 所以只能走完一棵子树, 再去走另一个. 考虑 \(dp\) , 设 \(f_{x,u,v}\) 表示从结点 \(x\) 开始, 第一个走到的叶子结点距离为 \(u\) , 走回 \(x\) 时的距离为 \(v\) , 路径上所有长度不大于二分值的情况下遍历完整个子树, 是否可行.

转移很显然, 然后发现当满足 \(a_1 \leqslant a_2,b_1 \leqslant b_2\) 时, \(f_{x,a_2,b_2}\) 完全没有存在的必要, 故按 \(u\) 排序后 \(v\) 递减时数量最少.

可以分析合并次数, 只在轻边的时候会合并, 合并 \(\log\) 次, 故状态总数为 \(n\log{n}\) 个.

时间复杂度 \(\mathcal{O}(n\log^2{n})\) .


\(\text{[AGC052D]Equal LIS}\)

\(\color{blue}{\text{[NORMAL]}}\)

挺好猜的, 但确实不好构造.

令原排列的 \(LIS\) 长度为 \(l\) .

若 \(l\) 为偶数, 那么直接令 \(f_i\) 为以 \(i\) 结尾的最长上升子序列长度, 将 \(f_i \leqslant \frac{l}{2}\) 的放入第一个序列, 其他的放入第二个序列即可.

否则 \(l\) 为奇数, 即 \(l=2k+1\) , 那么对于其中一个长度为 \(l\) 的 \(LIS\) , 要存在一个元素 \(x\) 不在此序列中, 且存在一个长度为 \(k+1\) 的上升子序列包含它.

这个条件的必要性显然, 充分性构造如下.

任选一个长度为 \(l\) 的 \(LIS\) , 根据这个性质, 选择 \(x\) 并假设这个 \(k+1\) 的上升子序列为 \(p_1,p_2,\dots,p_{k+1}\) .

将所有满足 \(\forall 1 \leqslant j \leqslant k+1\) , \(f_i \not= f_{p_j}\) 或 \(f_i=f_x\) 且 \(i \not= x\) 的选入第一个序列, 其余的选入第二个序列.

第二个序列中, 所有的 \(p_i\) 都被选入, 并且只有 \(k+1\) 种不同的 \(f\) 取值, 即不存在 \(k+2\) 的上升子序列, 故构成 \(k+1\) 的上升子序列.

第一个序列中, 由于总共只有 \(2k+1\) 种 \(f\) 的取值, 所以第一个序列中包含 \(k+1\) 种取值, 故也构成 \(k+1\) 的上升子序列.

关于判定, 求出每一个元素为起点和终点的最长上升子序列, 即可求出强制包含某个元素的最长上升子序列, 判定其是否大于等于 \(k+1\) 即可.

时间复杂度 \(\mathcal{O}(n\log{n})\) .


\(\text{[AGC006C]Rabbit Exercise}\)

\(\color{green}{\text{[EASY]}}\)

若选中点 \(a\) , 则期望的新位置为 \(\dfrac{(2x_{a+1}-x_a)+(2x_{a-1}-x_a)}{2} = x_{a+1}+x_{a-1}-x_a\) .

根据期望的可加性, \(E_a' = E_{a+1}+E_{a-1}-E_a\) , 这个式子只有加减, 涉及的项也相邻, 考虑差分.

令差分数组为 \(d\) , 不难发现 \(E_a' = E_{a-1}+d_{i+1}\) , 所以 \(d_i'=d_{i+1}.d_{i+1}' = d_i\) , 实际上是交换了差分数组位置.

那一次大操作就是一个置换, 我们可以单 \(\log\) 类似快速幂的做, 也可以做到线性.

具体来说就是把置换拆成若干个循环, 循环要移动的距离其实就是 \(k\bmod{size}\) 位, 递推即可.

时间复杂度 \(\mathcal{O}(n)\) .


\(\text{[AGC009E]Eternal Average}\)

\(\color{blue}{\text{[NORMAL]}}\)

我觉得很巧妙, 是不可多得的好题.

把问题写成 \(k\) 叉树的形式, 一共 \(n+m\) 片叶子其中 \(n\) 片写着 \(0\) , \(m\) 片写着 \(1\) . 对于一个非叶子结点, 它的值为它儿子的值的平均值.

假设那 \(n\) 个 \(0\) 的深度分别为 \(x_i\) , \(m\) 个 \(1\) 的深度分别为 \(y_i\) , 则根结点的值就是 \(\sum\limits_{i=1}^{m}{(\frac{1}{k})^{y_i}}\) , 并且我们知道, 假设所有点都是 \(1\) , 会有 \(\sum\limits_{i=1}^n{(\frac{1}{k})^{x_i}}+\sum\limits_{i=1}^m{(\frac{1}{k})^{y_i}}\) , 若满足这两个条件, 则一定能构成合法的 \(k\) 叉树.

我们把 \(\sum\limits_{i=1}^{m}{(\frac{1}{k})^{y_i}}\) 写成 \(k\) 进制下的小数形式, \(Z=(0.\overline{z_1z_2\dots})_k\) , 即 \(m\) 个 \((\frac{1}{k})^{y_i}\) 相加, 而 \((1-Z)\) 则可以表示 \(n\) 个 \((\frac{1}{k})^{x_i}\) 相加, 不考虑进位, 则 \(\sum{z_i}=m\) , 考虑还原进位则将 \(z_i\) 减去 \(1\) 并将 \(z_{i+1}\) 加上 \(k\) , 所以 \(\sum{z_i}+a(k-1)=m\) , 即 \(\sum{z_i}\equiv m\pmod{k-1}\) , 假设小数有 \(len\) 位, 则 \(1-Z\) 的位数和应该是 \((len-1)(k-1)+k-\sum{z_i}=len(k-1)-\sum{z_i}+1\) .

接下来就可以 \(dp\) 方案数了, 设 \(f_{i,j,0/1}\) 表示 \(len=i\) , \(\sum{z_i}=j\) , \(z_i\) 是否为 \(0\) , 转移很简单.

\[f_{i,j,0}=f_{i-1,j,0}+f_{i-1,j,1}\\ f_{i,j,1}=\sum_{x=1}^{k}{f_{i-1,j-x,0}+f_{i-1,j-x,1}} \]

前缀和优化一下即可, 时间复杂度 \(\mathcal{O}(n^2)\) .


\(\text{[AGC041D]Problem Scores}\)

\(\color{blue}{\text{[NORMAL]}}\)

感觉还是有点巧妙的, 但也算是去单调性的常用做法.

首先应该先把第三个限制转化, 最开始我只转化为了前 \(k+1\) 个的和要大于后 \(k\) 个的和, 但是很明显的发现, 并不好 \(dp\) , 所以肯定还要转化一下.

但是显然只看限制三是已经没有前途的了, 结合限制一来看, 我们发现, 因为有单调性的限制, 所以我们只用考虑中点是否符合限制即可.

即需满足 \(\sum\limits_{i=1}^{\lfloor\frac{n}{2}\rfloor+1}{a_i}\geqslant \sum\limits_{i=n-\lfloor\frac{n}{2}\rfloor+1}^{n}{a_i}\) , 简单证明一下, 对于小于 \(\lfloor\frac{n}{2}\rfloor\) 的位置, 左边减去一个较小的数, 右边减去一个较大的数, 仍满足, 对于大于 \(\lfloor\frac{n}{2}\rfloor\) 的数, 左边加上一个较大的数, 右边加上一个较小的数, 仍满足, 当然这个的前提是有单调性.

但是有这个单调性我们还是不好做, 继续考虑转化, 我们考虑差分去掉这个单调性, 令 \(\Delta a_i=a_i-a_{i-1}\) , 为了不让 \(\Delta a_1\) 很奇怪, 我们令 \(a_0 = 1\) , 这样每个 \(a_i\) 实际上就是 \(a_i=1+\sum\limits_{i=1}^{i}{\Delta a_i}\) .

整理一下式子,

\[\sum_{i=1}^{\lfloor\frac{n}{2}\rfloor}{\sum_{j=1}^{i}{\Delta a_j}}\geqslant \sum_{i=n-\lfloor\frac{n}{2}\rfloor+1}^{n}{\sum_{j=1}^{i}{\Delta a_j}} \]

向下取整会影响一点东西, 但其实问题不大, 还是分类一下吧.

对于 \(n\) 是奇数时, \(\lfloor\frac{n}{2}\rfloor\) 就是 \(\frac{n-1}{2}\) , 整理,一下式子

\[\sum_{i=1}^{\frac{n+1}{2}}{\sum_{j=1}^{i}{\Delta a_j}} \geqslant \sum_{i=\frac{n+1}{2}+1}^{n}{\sum_{j=1}^{i}{\Delta a_j}}\\ 2\sum_{i=1}^{\frac{n+1}{2}}{\sum_{j=1}^{i}{\Delta a_j}} \geqslant \sum_{i=1}^{n}{\sum_{j=1}^{i}{\Delta a_j}}\\ 2\sum_{i=1}^{\frac{n+1}{2}}{(\frac{n+1}{2}-i+1)\Delta a_i} \geqslant \sum_{i=1}^{n}{(n-i+1)\Delta a_i}\\ \sum_{i=1}^{n}{c_i\Delta a_i} \leqslant 0 \]

其中, \(c_i=\begin{cases}i-2 & ,\;i\leqslant \frac{n+1}{2}\\n-i+1 & ,\;i>\frac{n+1}{2}\end{cases}\) .

同样的, 考虑偶数, 最后可以推出来 \(c_i=\begin{cases}i-2 & ,\;i\leqslant \frac{n}{2}+1\\n-i+1 & ,\;i>\frac{n}{2}+1\end{cases}\) , 综合一下得到, \(c_i=\begin{cases}i-2 & ,\;i\leqslant \lfloor\frac{n}{2}\rfloor+1\\n-i+1 & ,\;i>\lfloor\frac{n}{2}\rfloor+1\end{cases}\) .

好, 现在我们只有限制二没用上了, 即 \(\sum{\Delta a_i}+1\leqslant n\) , 我们发现有的序列是本质相同的, 使得它不同的原因是 \(\Delta a_1\) .

于是我们考虑确定 \(\Delta a_2 \sim \Delta a_n\) 的值的时候有多少合法的 \(\Delta a_1\) , 有两个条件 \(\begin{cases}\Delta a_1\leqslant n-1-\sum\limits_{i=2}^{n}{\Delta a_i}\\ \Delta a_1 \geqslant \sum\limits_{i=2}^{n}{c_i\Delta a_i} \end{cases}\) , 所以合法的个数就是 \(\max\{0,n-\sum\limits_{i=2}^{n}{(c_i+1)\Delta a_i}\}\) .

我们令 \(f_i\) 为 \(\sum\limits_{i=2}^{n}{(c_i+1)\Delta a_i}=i\) 的个数, 那么最终答案就是 \(\sum\limits_{i=0}^{n-1}{(n-i)f_i}\) .

不难发现计算 \(f_i\) 就是一个背包, 第 \(i\) 个物品重量为 \(c_i+1\) , 做无限背包, 时间复杂度 \(\mathcal{O}(n^2)\) .


\(\text{[AGC041F]Histogram Rooks}\)

\(\color{red}{\text{[HARD]}}\)

\(too\;hard\;for\;me\) , 题解差评, 不应该强加笛卡尔树上去的, 容斥检验成果题? 成果检查到不合格.

最初想法, 枚举哪些格子没有被覆盖, 然后对于一个位置如果行列都没有被钦定未覆盖的格子, 那么方案数是 \(2\) .

复杂度爆炸.

注意到如果一个格子被钦定未被覆盖, 那么他所在的列一定不能放棋子, 行有机会可以放, 重新设计容斥方案.

枚举哪些列里面有格子是未被覆盖的, 那么这些列都不可以放棋子, 设这些列的集合为 \(S\) .

此时考虑一个极长行连续段的贡献, 假设有 \(p\) 个格子在 \(S\) 里, 那么贡献有两种.

  1. 这 \(p\) 个格子可以被覆盖, 方案数 \(2^{len-p}\) .
  2. 枚举有几个格子是未覆盖的, 方案数为 \(\sum\limits_{i=1}^{p}{\binom{p}{i}(-1)^i}=-[p\not=0]\) .

但这样算出来会是错的, 因为 \(S\) 里的列可能没有被钦定的格子.

再套上一个容斥, 枚举集合 \(T\subseteq S\) , 表示没有被钦定的格子.

设一个极长连续段里面有 \(q\) 个格子在 \(T\) 里, 那么第二种贡献变成 \(-[p\not=q]\) .

注意到此时贡献只和 \(p,[p\not=q]\) 有关, 所以状态数不会太大.

每次从 \(h\) 最小的地方切开, 下面是一个矩形, 上面是子问题, 且子问题是树形结构, 矩形里的连续段就是上面的子问题加单独算的列.

于是设 \(f_{x,p,0/1}\) 表示树上的结点 \(x\) , \(S\) 的大小为 \(p\) , 是否有 \(p\not=q\) .

转移背包合并即可, 独有的列可以看做特殊的儿子, 此时每一列方案数是相同的, 快速幂即可.

时间复杂度 \(\mathcal{O}(n^2\log{n})\) , 预处理后 \(\mathcal{O}(n^2)\) .


\(\text{[AGC043D]Merge Triplets}\)

\(\color{green}{\text{[EASY]}}\)

挺有意思的一道题的, 不算难, 其实多想一会应该是能想出来的, 可惜想这题的时候想了一会就摆了.

首先发现, 能构造出来的序列有一个显然的必要条件, 一个数作为新排列的前缀 \(\max\) 的时候, 长度不会超过 \(3\) , 并且如果存在长度为 \(3\) 的段, 那它在原排列中一定在一组里, 但这个条件并不充分.

既然不会超过 \(3\) , 那我们关注一下 长度为 \(2\) 和 \(1\) 的, 可以发现, 如果存在一个长度为 \(2\) 的, 首先这两数一定在同一组, 并且那一组一定存在一个长度为 \(1\) 的.

这时候我们应该敏锐的考虑同组的在新排列的前缀 \(\max\) 序列中的构成, 长度为 \(3\) , 或者是三个长度为 \(1\) 的, 或者是一个长度为 \(2\) 的和一个长度为 \(1\) 的, 最后一种前后顺序并不重要, 一定是会有合法构成方案的.

这时候充分条件就很显然了, 长度为 \(2\) 的段数不超过长度为 \(1\) 的段数.

考虑如何计数, 由于只关注长度为 \(2\) 的段数和长度为 \(1\) 的段数差, 所以可以设 \(f_{i,j}\) 表示考虑前 \(i\) 个数, 长度为 \(1\) 的段数减去长度为 \(2\) 的段数值为 \(j\) 的方案数.

如果 \(a_i\) 在 \([1,r]\) 中是最大的, 对于长度为 \(n\) 的排列, 答案就是 \(\frac{n!}{\prod{r}}\) , 转移的时候带到系数里即可.

时间复杂度 \(\mathcal{O}(n^2)\) .


这个 \(\text{Part}\) 也让我成长了不少啊.

标签:Atcoder,frac,试题,limits,text,sum,Part2,Delta,长度
From: https://www.cnblogs.com/Lonely923/p/16732578.html

相关文章

  • Atcoder试题乱做 Part4
    时光怎不经一生浮浮沉沉已半生一壶浊酒欲随风一步一瞥似惊鸿情字要如何追问一指兰花为谁挽留\(\text{[ARC147D]SetsScores}\)\(\color{green}{\text{[EASY]}}\)......
  • Atcoder试题乱做 Part3
    最后一年了,一年不到,为了可爱的学长们,为了自己,要拼命了啊.\(\text{[AGC048D]PockyGame}\)\(\color{green}{\text{[EASY]}}\)怎么这都做不出来,废物啊.显然石......
  • Redis面试题
    为啥快?1.基于内存2.优秀的数据结构,大多数O(1)时间复杂度的命令3.自定义redis协议4.多路I/O复用模型5.单线程,避免线程切换影响持久化方式区别?AOF(保存的是命令)......
  • Python菱形继承(网易面试题)
    菱形继承顾名思义,是一个菱形继承(好像是废话),直接上图  菱形继承就是多继承,例上图所有,A是父类,B和C是A的子类,B和C是D的父类。classParent(object):def__init__(......
  • 你需要知道的webpack高频面试题
    谈谈你对webpack的看法webpack是一个模块打包工具,可以使用它管理项目中的模块依赖,并编译输出模块所需的静态文件。它可以很好地管理、打包开发中所用到的HTML,CSS,JavaScr......
  • 2022新鲜的阿里外包产品经理面试题
    虎哥寄语面试,就是一场博弈,你要在一定的时间内高效的证明你的能力,符合这个岗位需求、符合这个薪资需求、符合面试官个人需求。深度思考一下,对应问题要如何答复,才能既符合自......
  • Vue面试题22:说一说Vue实例在挂载过程中发生了什么 (总结自B站up主‘前端杨村长’视频,仅
    挂载过程中完成了两件最重要的事:初始化(App实例的创建、数据状态的初始化、选项的处理、建立响应式数据等)建立更新机制,把这两件事说清除即可回答范例1.挂载过程指的是ap......
  • golang面试题3
    go基础1、redis部署多节点模式,异步队列2、go-redis和redis-go//go-redis的连接模式,直连哨兵3、go异常处理,异常捕获方式,go里面替代try-catch如何操作4、gomaxprocs的默认......
  • 面试题1
    #第一题(列举了解的编程语言及语言的区别)编译型语言:一次性把代码都编译成二进制,然后运行解释型语言:实时性一行一行,编译一句,运行一句1.python解释型简洁高效,......
  • AtCoder Beginner Contest 270
    AtCoder五十连练第一练AtCoderBeginnerContest270A-1-2-4Test考试有三道题,分别是\(1\)分、\(2\)分、\(4\)分。高桥、青木和Snuke参加了这次考试。高桥得......