首页 > 其他分享 >Public Round #13 题解

Public Round #13 题解

时间:2024-06-30 23:54:18浏览次数:1  
标签:13 题解 sum len times ans 斜线 binom Public

旋转序列

来源:

两个串之间 \(1\) 匹配的次数总和为 \(k\times l\),并且共有 \(n\) 次匹配。

于是答案的上界为 \(k\times l\) 个球放进 \(n\) 个盒子,最小化最大的盒子中的 \(1\) 个数,也就是 \(\lceil \dfrac{k\times l}{n} \rceil\)。

设 \(ans = \lceil \dfrac{k\times l}{n} \rceil\),我们可以构造来达到这个上界:

  • 对于第一个串,将前 \(k\) 个位置变成 \(1\)。
  • 对于第二个串,设这个串的前缀和数组为 \(sum_i\)。设 \(sum_i = \min(\lfloor\dfrac{(i+1)\times ans}{k} \rfloor,l)\),然后差分即可。

交换豆子

来源:

假设 C1P0

枚举第一行最后有多少个 \(1\),由于 \(1\) 的总个数不变,因此第一/第二行的 \(1\) 的个数是确定的。

假设 \(y\) 坐标为 \([1,2]\),\(x\) 坐标为 \([1,n]\),此时我们想要最小化 移动步数 + 最后所有 \(1\) 的 \(x\) 坐标之和,答案就是这个值减去 \(c_1(c_1+1)/2+c_2(c_2+1)/2\)。

上下的移动步数是确定的,只需要最小化向右的移动步数(这些移动步数会增加 \(x\) 坐标,每移动一步会有 \(2\) 的代价,因为要增大 \(x\) 坐标且多移动一次)。

接下来观察一些性质:

  • 把一个 \(1\) 从上往下调一定不优。
  • 我们可以考虑先做若干次向右移动,直到某个时刻上下调整可以使得上下的个数满足要求,然后再上下调整。

什么情况下可以满足要求?若一列有 \(2\) 个 \(1\),则这列必须在第二行有一个 \(1\),也就是有 \(2\) 个 \(1\) 的列不能超过 \(c_2\) 个。

对于一个前缀的若干列,设有 \(sum_i\) 个 \(1\) 和 \(i\) 列,则有 \(\max(0,sum_i-i-c_2)\) 个 \(1\) 必须向右调,需要花费的代价就是 \(\sum 2\times \max(0,sum_i-i-c_2)\)。

对于每种 \((c_1,c_2)\) 维护一个 \(ans_{c_2}\),交换同一列两个时 \(sum_i\) 不改变;交换不同列时只有 \(1\) 个 \(sum_i\) 会改变至多 \(1\),只需要在 \(ans\) 上区间加。

用线段树维护 \(ans\) 数组,时间复杂度 \(O(n+q\log n)\)。

序列计数

来源:

考虑转化成一个格路计数问题:

  • 有一个 \(n\times m\) 的网格,每次可以往上或往右走,要从 \((0,0)\) 走到 \((n,m)\)。
  • 每次从 \((i,j)\to (i+1,j)\) 就确定了 \(a_{i+1}=j\),称 \((i,j)\to (i+1,j)\) 为横线。
  • 对于求 \(\{a_i-i\}\),可以转化成:画出 \(y=x+k(-(n-1)\le k \le m)\) 的所有斜线,对于每条斜线,若有 \(c\) 个横线在它的上方经过,则将 \(ans_{n-k+1}\dots ans_n\) 加上 \(1\)。

考虑对于每条斜线算贡献,我们想要对于每个 \(c\) 算出,有多少个方案恰有 \(c\) 个横线在它的上方经过。

先特判掉所有没有触碰这条斜线的情况,这部分贡献可以 \(O(n)\) 算出。

枚举这条斜线上的两个位置,钦定这是走的路径第一次、最后一次触碰斜线的位置。

我们有结论:

  • 在一个 \(n\times n\) 的网格中从 \((0,0)\) 走到 \((n,n)\),设所有 \((i,j)\to (i+1,j)\) 在对角线上方经过的次数为 \(c\) 的方案数是 \(ans_c\),则所有 \(ans_c\) 相等,均为 \(\frac{\binom{2n}{n}}{n+1}\)。

于是钦定第一次、最后一次的触碰位置后,可贡献的 \(c\) 是一个区间,且对于区间中的每个 \(c\) 贡献相等。于是只需要在差分数组上修改。

直接枚举算贡献的复杂度是 \(O(n^3)\) 的,考虑如何优化。

把 \(y=x+k\) 的直线分成 \(k\in [0,m-n]\) 和 \(k\in [-(n-1),-1]\) 两部分。\([m-n+1,m]\) 和 \([-(n-1),-1]\) 是对称的。


考虑 \(k\in [-(n-1),-1]\) 的部分。

假设我们确定了触碰始终点之间的长度 \(len\),则在差分数组上的修改位置是确定的。

枚举 \(len\),那这段触碰始终点之间的方案是固定的 \(\frac{\binom{2len}{len}}{len+1}\),前后两段的形式都是 \((0,0)\to (a,b)\) 且不触碰 \(y=x+(b+1-a)\) 的折线个数(假设把后面一段对称一下)。

把这两段折线拼起来,就变成了一段折线,形式也是 \((0,0)\to (a,b)\) 不触碰 \(y=x+(b+1-a)\),且 \(a,b\) 只和 \(len\) 有关。这样前后的方案数就变成了两个组合数相减的形式。

再枚举所有的 \(k\) 加起来,发现加减的项抵消了,可以 \(O(1)\) 计算同一个 \(len\) 的方案数。于是这部分能做到 \(O(n)\)。


考虑 \(k\in [0,m-n]\) 的部分。

由于我们是在差分数组上修改,我们可以只关心:对于所有触碰起点/终点,其方案数之和。起点和终点是相似的,下面只考虑起点。

由于起终点之间的方案数就是 \(\frac{\binom{2len}{len}}{len+1}\) 的形式,我们钦定这部分全部在斜线上面走。那折线就变成了 \((0,0)\) 到起点且只在起点触碰斜线 乘上 起点到 \((n,n)\) 并且不穿过斜线。

这样也是两个 \((0,0)\to (a,b)\) 不触碰 \(y=x+(b+1-a)\) 的形式,可以把两段折线拼起来,贡献是两个组合数相减。

再枚举所有的 \(k\) 加起来,发现是要求若干个如下的形式:

\[\sum_{k=0}^{m-n}\binom{2p+k}{p}\binom{n+m+k-2p}{n-p} \]

观察一下,发现上面加起来是常数,下面加起来也是常数。把这个看作要求 \(\sum_{i=l}^{r} \binom{i}{k}\binom{n-i}{m-k}\)。

先差分成求 \(\sum_{i=0}^{r} \binom{i}{k}\binom{n-i}{m-k}\)。若移动起点 \(p\to p+1\),则 \(n,m\) 不会修改,\(r,k\) 有 \(O(1)\) 的变化量,则这个式子可以 \(O(1)\) 维护:

  • 增大 \(r\) 显然只需要加上一项。
  • 增大 \(k\) 的话,考虑这个式子的组合意义是“在 \(n\) 个白球中染黑 \(m\) 个,且第 \(k\) 个黑球的位置 \(\le r\)”。若 \(k\to k+1\),则限制变成“第 \(k+1\) 个黑球的位置 \(\le r\)”,需要减去第 \(k+1\) 个黑球位置 \(> r\) 的情况。

于是这部分也能做到 \(O(n)\)。

标签:13,题解,sum,len,times,ans,斜线,binom,Public
From: https://www.cnblogs.com/Rainbowsjy/p/18276418

相关文章

  • C++基础语法——《循环结构》题解
    循环结构参考资料:https://blog.csdn.net/m0_56945138/article/details/118929416需要掌握:1.for循环用法2.while循环用法3.continue跳过和break终止题号题目名称题解链接3067输出范围内的整数https://www.cnblogs.com/jyssh/p/182740551206简单的累加https://www......
  • [JLU] 数据结构与算法上机题解思路分享-第一次上机
    前言首先,请务必自己尽全力尝试实现题目,直接看成品代码,思维就被拘束了,也很容易被查重。这里只是思路解析的博客,代码仓库是JLU_Data_Structures_Record希望你能在这里找到你想要的:)正文A调皮的哈利分数30作者朱允刚单位吉林大学贝蒂是个打字高手,打字时有不看屏幕的习......
  • 力扣第213题“打家劫舍 II”
    在本篇文章中,我们将详细解读力扣第213题“打家劫舍II”。通过学习本篇文章,读者将掌握如何使用动态规划来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。问题描述力扣第213题“打家劫舍II”描述如下:你是一个专业的小偷,计......
  • abc360_G Suitable Edit for LIS 题解
    题目链接:Atcoder或者洛谷来讲讲纯降智做法,不需要任何智商的做法,顺带整活:对于一个\(LIS\)可以拆成\(preLIS+sufLIS\),而我们现在至多可以修改一个点,那么如果\(preLIS\)的末尾元素为\(x\),\(sufLIS\)的末尾元素为\(y\),那么如果有\(y-x\ge2\),那么我们可以至少找到一个元......
  • 【ESP32】打造全网最强esp-idf基础教程——13.ESP32中的NVS
    ESP32中的NVS    这几天的天气只有钱包的余额能让我冷静,好好活着,每天都有新的打击,写写博客压压惊。一、什么是NVS?    NVS即Non-volatilestorage,意思是非易失存储,也就是掉电后能依然能持久化保存数据。在我们应用NVS时,一般用于存储一些配置数据、状态数据等,一......
  • 数据分析必备:一步步教你如何用matplotlib做数据可视化(13)
    1、Matplotlib文本Matplotlib具有广泛的文本支持,包括对数学表达式的支持,对光栅和矢量输出的TrueType支持,具有任意旋转的换行符分隔文本以及unicode支持。Matplotlib包含自己的matplotlib.font_manager,它实现了一个跨平台,符合W3C标准的字体查找算法。用户可以对文本属性(......
  • 2713. 矩阵中严格递增的单元格数 Hard
    给你一个下标从 1 开始、大小为 mxn 的整数矩阵 mat,你可以选择任一单元格作为 起始单元格 。从起始单元格出发,你可以移动到 同一行或同一列 中的任何其他单元格,但前提是目标单元格的值 严格大于 当前单元格的值。你可以多次重复这一过程,从一个单元格移动到另一......
  • JAVA高级进阶13单元测试、反射、注解
    第十三天、单元测试、反射、注解单元测试介绍单元测试就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试咱们之前是如何进行单元测试的?有啥问题?只能在main方法编写测试代码,去调用其他方法进行测试。无法实现自动化测试,一个方法测试失败,可能影响其他方......
  • 【重写SpringFramework】第一章beans模块:本章小结(chapter 1-13)
    1.前言在Spring框架中,beans模块是仅次于core模块的基础模块。我们知道,IOC机制是Spring框架的两大基石之一,beans模块的主要任务就是实现控制反转和依赖注入的功能。从具体实现来说,BeanFactory接口是整个模块的核心接口,几乎所有功能都是围绕对象展开的。BeanFacto......
  • AI数据分析013:根据时间序列数据生成动态条形图
    文章目录一、介绍二、输入内容三、输出内容一、介绍动态条形竞赛图(BarChartRace)是一种通过动画展示分类数据随时间变化的可视化工具。它通过动态条形图的形式,展示不同类别在不同时间点的数据排名和变化情况。这种图表非常适合用来展示时间序列数据的变化,能够直......