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

Atcoder试题乱做 Part7

时间:2023-02-23 09:35:40浏览次数:50  
标签:Atcoder 试题 limits color text sum len Part7 mathcal

怎么说呢, \(Clash\) 真好用, \(Privado\) 再见.


\(\text{[ABC219H]Candles}\)

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

联考见过类似的, 直接设 \(f_{l,r,i,0/1}\) 表示覆盖了区间 \([l,r]\) , 区间外有 \(i\) 个点寄了, 现在在左端点或右端点的最大答案, 费用提前即可.

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


\(\text{[ABC223H]Xor Query}\)

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

一眼线性基, 那就对每个 \(i\) 维护一个前缀的线性基, 插入 \(a_i\) 的时候尽量让它在高位即可.

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


\(\text{[ABC224H]Security Camera 2}\)

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

看着就很对偶, 看看对偶的式子 \(\max c^{\top}x,s.t.\;Ax\leqslant b=\min b^{\top}y,s.t.\; A^{\top}y\geqslant c\) .

也就是根据题目有

\[\min{\sum_{i=1}^{L}{A_il_i}+\sum_{i=1}^{R}{B_ir_i}}\\ s.t.\begin{cases} l_i+r_j\geqslant C_{i,j}\\ l_i\geqslant 0\\ r_i\geqslant 0 \end{cases} \]

提出 \(l_i+r_j\geqslant C_{i,j}\) , 同时乘以一个非负实数, \(k_{i,j}(l_i+r_j)\geqslant k_{i,j}C_{i,j}\) , 取对偶问题

\[\max{\sum{k_{i,j}C_{i,j}}}\\ s.t.\begin{cases} \sum_{j}{k_{i,j}}\leqslant A_i\\ \sum_{j}{k_{i,j}}\leqslant B_i\\ k_{i,j}\geqslant 0 \end{cases} \]

接下来就是网络流了, 原点向左侧 \(L\) 个点连流量为 \(A_i\) , 费用为 \(0\) 的边, 右侧 \(R\) 个点向汇点连流量为 \(B_i\) 费用为 \(0\) 的边, \(L_i\) 向 \(R_j\) 连流量为 \(\infty\) , 费用为 \(C_{i,j}\) 的边.


\(\text{[ABC226H]Random Kth Max}\)

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

来一个经典我不知道结论, 对于 \(n\) 个连续随机变量 \(x_i\) , 取值均在 \([0,1]\) , 第 \(k\) 小的期望.

证明考虑引入第 \(n+1\) 个连续随机变量, 那第 \(k\) 小的期望即为第 \(n+1\) 个随机变量排名小于等于 \(k\) 的概率, 即 \(\frac{kn!}{(n+1)!}=\frac{k}{n+1}\) .

第 \(k\) 大的期望即为 \(1-\frac{k}{n+1}\) .

把原问题拆成一个个线段, 那么我们考虑枚举第 \(k\) 大在哪个段内, 考虑 \(dp\) , 令 \(f_{i,j,k}\) 表示考虑了前 \(i\) 个数, 有 \(j\) 个在当前枚举的线段右边, \(k\) 个在当前线段内的概率, 可以从 \(f_{i-1,j,k}\) , \(f_{i-1,j,k-1}\) 和 \(f_{i-1,j-1,k}\) 三处转移过来, 转移时判一下是否合法.

答案即为 \(\sum\limits_{a=0}^{\max{r_i}}{\sum\limits_{j,l}f_{n,j,l}(a+1+\frac{k-j}{l+1})}\) , 时间复杂度 \(\mathcal{O}(n^4)\) , 可以继续优化到 \(\mathcal{O}(n^2k)\) .


\(\text{[AGC049E]Increment Decrement}\)

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

先看子问题, 有 \(A\) 序列之后怎么求这个序列的代价, 首先发现操作顺序是无所谓的, 所以可以假设先做操作二再做操作一, 假设我们知道了做完操作二之后得到的序列 \(D\) , 那我们也就知道了整个操作方法的代价 \(\sum\limits_{i=1}^{n}{C\max\{D_i-D_{i-1},0\}+|A_i-D_i|}\) .

根据此我们想到一个 \(dp\) , 令 \(f_{i,j}\) 表示考虑了前 \(i-1\) 个数, 钦定 \(D_i=j\) 的最小代价, 不难列出转移 \(f_{i,j}=\min\limits_{k\geqslant 0}\{f_{i-1,k}+C\max\{j-k,0\}+|j-A_i|\}\) .

我们把 \(f_{i,j}\) 看成关于 \(j\) 的函数, 不难用归纳法证明这个函数是凸的, 启示我们用 \(slope\;trick\) 优化.

分析之后可以发现求代价的过程可以描述为, 建立一个可重集 \(S\) , 包含 \(C\) 个 \(0\) , 从小到大对于每个 \(i\) , 将两个 \(A_i\) 放入 \(S\) 中, 将答案加上 \(A_i-\min{S}\) , 然后删除 \(S\) 中的最大值和最小值.

那么原问题变成了一个计数问题, 不妨对于每个值 \(x\) , 求它在 \(S\) 中作为最小值被删去的次数 \(cnt_x\) , 这玩意不好计算, 考虑计算小于 \(x\) 的方案, 再差分回去, 枚举 \(x\) , 由于只关注大小, 不放把小于 \(x\) 的都看成 \(0\) , 大于等于 \(x\) 的都看成 \(1\) , 这样 \(S\) 中始终只有 \(0\) 和 \(1\) .

设 \(g_{i,j}\) 表示考虑刚加进两个 \(A_i\) 时 \(S\) 中恰好有 \(j\) 个 \(1\) 的方案数, 可以得到

\[\sum_{i=0}^{x-1}{cnt_i}=K^n-\sum_{i=1}^{n}{g_{i,C+2}} \]

因为只要不是有 \(C+2\) 个 \(1\) , 我们删掉的最小值一定是 \(0\) .

最后答案即为 \(\sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{K}{(K^{n-1}-cnt_{B_{i,j}})B_{i,j}}}\) , 时间复杂度 \(\mathcal{O}(n^2K(K+C))\) .


\(\text{[ABC225H]Social Distance 2}\)

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

基础的推式子题.

先不考虑区分那 \(m-k\) 个人, 只考虑位置, 最后给答案乘上 \((m-k)!\) 即可.

把情况分类, 新插入的人可能在两个固定的人之间, 或者只有左边或者右边有固定的人, 或者没有固定的人.

我们把问题具体一点, 有 \(len\) 个连续的椅子, 第一个椅子前和最后一个椅子后有人, 有 \(k\) 个人来做, 所有方案权值和, 剩下两个类似.

不难发现第一个就是把 \(len+1\) 拆分成 \(k+1\) 个有序的正整数, 这些正整数的乘积, 那我们现在算把 \(n\) 拆成 \(k\) 个的答案.

可以直接写出生产函数 \(F(x)=(\sum\limits_{i}{ix^i})^k\) , 答案即为 \([x^n]F(x)\) , 考虑写出 \(\sum\limits_{i}{ix^i}\) 的封闭形式 \(\dfrac{x}{(1-x)^2}\) .

那么有 \(F(x)=\dfrac{x^k}{(1-x)^{2k}}\) , 答案即为 \([x^{n-k}]\dfrac{1}{(1-x)^{2k}}\) , 而 \(\dfrac{1}{(1-x)^{2k}}=\sum\limits_{i}{\dbinom{i+2k-1}{i}x^i}\) , 所以答案为 \(\dbinom{n+k-1}{n-k}\) .

第一个值为 \(\dbinom{len+k+1}{2k+1}\) .

计算第二个值, 不妨假设是在最左边有固定的人, 考虑枚举最后一个人的位置, 剩下的情况变成了第一个值.

即 \(\sum\limits_{i=k}^{len}{\dbinom{i-1+k-1+1}{2(k-1)+1}}=\dbinom{len+k}{2k}\) .

如果题目中的 \(k\) 为 \(0\) 就是第三种, 考虑枚举最后序列的长度, 那么剩下的情况也变成第一个值.

即 \(\sum\limits_{i=k}^{len}{(len-i+1)\dbinom{i-2+k-2+1}{2(k-2)+1}}\) , 简单化简之后得 \(\dbinom{len+k-1}{2k-1}\) .

答案即为把各个区间的生产函数卷起来, 分治 \(FFT\) 即可, 时间复杂度 \(\mathcal{O}(n\log^2{n})\) .


\(\text{[ARC132F]Takahashi The Strongest}\)

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

不难发现, 这个石头剪刀布序列是一个四进制的集合幂级数操作, 也就是说题目给了我们两个集合幂级数, 我们需把它进行一个类似与卷积的事, 计算答案的时候容斥一下, 也是做一个高维前缀和.

我们只需要刻画出变换矩阵和逆矩阵即可, 即 \(\begin{bmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\\1&1&1&1\end{bmatrix}\) , 逆矩阵即为 \(\begin{bmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\\-1&-1&-1&1\end{bmatrix}\) .

时间复杂度 \(\mathcal{O}(4^nn)\) .


\(\text{[ABC222H]Beautiful Binary Tree}\)

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

首先可以转化到题意各个点的权值和为 \(n\) , 并且任意一边上的点不全为 \(0\) , 且根节点权值为 \(1\) .

暴力的 \(dp\) , 设 \(f_{i,0/1}\) 表示和为 \(i\) 且根节点权值为 \(0/1\) 的二叉树, 且满足任意一边上的点不全为 \(0\) , 有转移

\[f_{n,0}=2f_{n,1}+\sum_{i=0}^{n}{f_{i,1}f_{n-i,1}} \;,f_{1,0}=0\\ f_{n,1}=2(f_{n-1,0}+f_{n-1,1})+\sum_{i=0}^{n-1}{(f_{i,0}+f_{i,1})(f_{n-1-i,0}+f_{n-1-i,1})} \;,f_{1,1}=1 \]

写成生成函数

\[F_0(x)=2F_1(x)+F_1^2(x)\\ F_1(x)=x(1+2(F_0(x)+F_1(x))+(F_0(x)+F_1(x))^2)=x(F_0(x)+F_1(x)+1)^2\\ F_1(x)=x(F_1^2(x)+3F_1(x)+1)^2 \]

我们要求的即为 \([x^n]F_1(x)\) , 考虑拉格朗日反演, 构造复合逆 \(G(x)=\dfrac{x}{(x^2+3x+1)^2}\) , 套公式

\[\begin{align} [x^n]F_1(x) &=\frac{1}{n}[x^{n-1}](x^2+3x+1)^{2n}\\ &= \frac{1}{n}\sum_{i=0}^{2n}{\binom{2n}{i}[x^{n-1}]x^{2i}(3x+1)^{2n-i}}\\ &=\frac{1}{n}\sum_{i=0}^{2n}{\binom{2n}{i}\binom{2n-i}{n-2i-1}3^{n-2i-1}} \end{align} \]

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


\(\text{[ABC228H]Histogram}\)

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

容易证明最优方案一定是将 \(a\) 排序之后划分成一段一段的, 每一段都变成段内最大值.

容易得到 \(\mathcal{O}(n^2)\) 的 \(dp\) , 令 \(f_{i}\) 为前 \(i\) 个数分段, 钦定 \(i\) 为段末尾的最小代价, 转移很显然 \(f_{i}=\min\limits_{j<i}\{f_j+\sum\limits_{k=j+1}^{i}{C_k+(a_i-a_k)}+x\}\) .

中间部分前缀和优化, \(f_{i}=\min\limits_{j<i}\{f_{j}+a_i(sumc_i-sumc_j)-sum_i+sum_j+x\}\) , 变成斜率优化的裸题了.


\(\text{[ABC232H]King\&\#39;s Tour}\)

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

自己做的时候总能搞出各种奇奇怪怪的方法通过此题, 但 \(sol\) 给出的做法确实很简洁啊.

对于只有 \(2\) 行或者是只有 \(2\) 列的是容易特殊构造的, 我们考虑 \(n,m>2\) 的情况.

我们令集合 \(S=\{(1,1),(2,1),\dots,(n,1),(n,2)\}\) , 分 \((a,b)\not\in S\) 和 \((a,b) \in S\) 讨论, 对于前者, 直接按着 \(S\) 走, 变为了一个新的子问题, 且问题形式不变, 对于后者, 旋转棋盘即可得到相同的子问题.


犹豫一定败北, 果断不一定白给.

标签:Atcoder,试题,limits,color,text,sum,len,Part7,mathcal
From: https://www.cnblogs.com/Lonely923/p/17146721.html

相关文章

  • #yyds干货盘点# LeetCode面试题: 括号生成
    1.简述:数字n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。 示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]......
  • Linux相关的面试题
    1、说一下你比较常用的命令答:目录以及文件相关的有:cd  切换目录ls  显示目录下的文件  -a显示包括隐藏文件的所有文件  -l显示文件详细信息  -ltr以......
  • 测试基础相关的面试题
    1、作为测试人员,你有完成过哪些工件的输出?---答:有测试用例、测试报告、测试用例执行结果、缺陷明细这些交付件。 2、测试报告有哪些内容?答:大概有项目背景、测试范围......
  • 面试 - Android 几个面试题
    1.requestLayout,invalidate和postInvalidate的异同?答:(1)、android中实现view的更新有几种方法?你知道吗?其实android中实现view的更新有两种方法,一种是invalidate,另一种是po......
  • 5 .NET Core笔试题
    1.说说你知道的ORM框架?2.请问对EFCore有了解吗?3.说说EFCore查询的性能调优小技巧?4.EFCore如果通过数据生成实体和DbContext?5.说说对SaveChanges的理解?6.说说对EFCo......
  • AtCoder xmascon21 Count Me
    重新看了一遍这题,我还是认为这不是人类能做的题。考虑没有?怎么做,把操作看做倒着删除,删\(n-1\)次的不同方案数。考虑钦定去重,并简化操作:钦定每次删\(0\)只能删一段......
  • 前端二面react面试题集锦
    reactdiff算法我们知道React会维护两个虚拟DOM,那么是如何来比较,如何来判断,做出最优的解呢?这就用到了diff算法diff算法的作用计算出VirtualDOM中真正变化的部分,并......
  • 线程常见面试题
    1.线程和进程有什么区别?进程:程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存,在指令运行过程中还需要用到磁盘,网络等设备,......
  • 社招前端常考react面试题总结
    react强制刷新component.forceUpdate()一个不常用的生命周期方法,它的作用就是强制刷新官网解释如下默认情况下,当组件的state或props发生变化时,组件将重新渲染。......
  • Atcoder Educational DP Contest
    序言dp的水平太......