ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

atcoder做题记录

2022-04-22 13:00:05  阅读:197  来源: 互联网

标签:atcoder le 记录 sum 做题 序列 2n 排序 dp


AGC036F - Square Constraints

给定 \(n\) ,问有多少个排列 \(0\sim 2n-1\) 的排列 \(\{p_i\}\) 满足:

对于 \(\forall i\in[0,2n-1]\),有 \(n^2\le i^2+p_i^2\le (2n)^2\)。\(n\le 250\)。

view solution

真神仙题,核心转化:

  • 问题中不合法以及合法的部分都是一段前缀,因此可以想到容斥

设 \(l_i=\lceil n^2-i^2 \rceil-1,r_i=\lfloor (2n)^2-i^2\rfloor\)。可以想到经典容斥,枚举某 \(k\) 个数,强制令它们 \(\le l_i\),其他数只需要满足 \(\le r_i\),求出此时的答案。

每个数只有上限没有下限时,可以将所有数的上限从小到大排序,那么所有前面的数的选择都会导致后面的属选择空间 \(-1\),设第 \(i\) 个数的上限为 \(a_i\),不难得到答案就是 \(\prod_{i=0}^{2n-1}(a_i-i+1)\)。

但直接 \(2^n\) 枚举复杂度太高,考虑用 \(dp\) 维护这个排序求答案过程。由于原问题中只有 \([0,n)\) 中的数是有下界的,因此可以先对 \([0,n)\) 中的数以 \(l_i\) 为关键字,对 \([n,2n)\) 中的数以 \(r_i\) 为关键字从小到大排序。记 \(f_{i,j}\) 表示考虑了前 \(i\) 个数,有 \(j\) 个数被钦定 \(\le l_i\) 时的选择方案数。

考虑加入第 \(i\) 个数时的转移:

  • 如果 \(i\in[n,2n)\),那么此时它的可选空间为 \(r_i+1\),但还要排除已选择的数中上界 \(\le r_i\) 的:

    • 已经被考虑过的数中上界选择 \(l\) 的,此时由于之前的排序,它们的上界一定 \(\le r_i\),一定占用了 \(j\) 个可选位置。
    • 已经被考虑过的数中没有下界的(也就是 \(\in[n,2n)\) 的),同样由于排序,它们一定会占用可选位置,可以用一个计数器 \(ct\) 来记录这部分数的数量。
    • 已经被考虑过的数中,有下界但上界选择 \(r\) 的,那么对方上界一定比 \(r_i\) 大,不会占用可选位置。

    因此有转移 \(f_{i,j}\gets f_{i-1,j}(r_i+1-j-ct)\)。

  • 如果 \(i\in [0,n)\),并且上界为 \(l\),那么分析过程与上一个几乎完全一致,有转移 \(f_{i,j}\gets f_{i-1,j-1}(l_i+1-(j-1)-ct)\)。

  • 如果 \(i\le [0,n)\) ,并且上界为 \(r\),那么一开始有 \(r_i+1\) 个可选位置,上限比它小的,就是所有上界选择 \(l\) 的数、所有 \(\in[n,2n)\) 的数,以及在它之前被考虑的 \(\in[0,n)\) 且上界为 \(r\) 的数,考虑在循环外先枚举上界选择 \(l\) 的数数量 \(k\),有转移 \(f_{i,j}\gets f_{i-1,j}(r_i+1-k-n-(i-j-ct))\) 。

于是进行一次 \(dp\) 的复杂度是 \(\mathcal O(n^2)\) 的,总复杂度即为 \(\mathcal O(n^3)\),可以通过此题。

注意排序的时候,如果上界相当,优先将 \(\in[0,n)\) 的排在 \(\in[n,2n)\) 的数前面,因为前者如果选择上界为 \(r\) 则会受后者影响。

AGC024E - Sequence Growing Hard

给定 \(n,k,m\) ,问有多少个序列组 \((A_0,A_1,\dots,A_n)\) 满足以下条件:

  • \(A_i\) 序列元素个数为 \(i\)。
  • 所有序列的元素都在 \([1,k]\) 内。
  • \(A_i\) 是 \(A_{i+1}\) 的子序列
  • \(A_i\) 字典序小于 \(A_{i+1}\)。

答案对 \(m\) 取模。\(n,k\le 300,m\le 10^9\)。

view solution

核心转化:

  • 加元素难以处理,可以反过来考虑删元素。
  • 对序列进行操作的问题,遇到限制条件 \(a_i>a_{i+1}\) 或 \(a_i<a_{i+1}\),可以考虑枚举最小数/最大数的位置。

对于原问题,可以发现从 \(A_i\) 到 \(A_{i+1}\) 相当于在 \(A_i\) 中加一个元素,字典序的限制则要求如果这个元素被放在 \(c_i\) 前方,则必须 \(\ge c_i\)。如果 \(=c_i\),那么得到的序列和放到 \(c_i\) 之后是一样的,因此我们可以假设加入的元素必须 \(>c_i\)。

但这个问题还是很难处理,考虑将问题倒过来,转化为初始有一个序列 \(A_n\),每一步可以选择 \(A_n\) 中的一个元素 \(s_i\) 删去,但必须满足 \(s_i>s_{i+1}\)。

对于这个限制条件,可以想到枚举 \(A_n\) 序列中的最小数的第一次出现的位置,设为 \(p\),那么 \([p+1,n]\) 区间中的元素都必须在 \(s_p\) 之前被删去,那么 \([p+1,n]\) 区间与 \([1,p-1]\) 区间就会一直被 \(s_p\) 隔开而不会互相产生影响,可以划分出两个子问题,当然还有一个额外的限制就是区间中的元素必须 \(\ge s_p\) 或者 \(>s_p\),于是考虑状态 \(dp_{i,j}\) 表示长为 \(i\) 的序列在元素必须 \(\ge j\) 的情况,有多少种删法。转移时枚举最小数以及其第一次出现的位置,有:

\[dp_{i,j}=\sum_{p=1}^{i}\sum_{k=j}^{m}dp_{p-1,k+1}dp_{n-p,k}\binom{n}{n-p} \]

后面乘的组合数是分配这 \(n\) 个元素的删除顺序。直接转移复杂度为 \(\mathcal O(n^2m^2)\),但注意到对于同一个 \(p\),\(dp_{i,j}\) 与 \(dp_{i,j+1}\) 的转移相比,只增加了一个 \(\mathcal O(1)\) 计算的 \(dp_{p-1,j+1}dp_{n-p,j}\),因此可以优化到 \(\mathcal O(n^2m)\)。

AGC040E - Prefix Suffix Addition

有一个长为 \(n\) 的序列 \(a_1,a_2,\dots,a_n\)。初始所有 \(a_i\) 都为 \(0\),可以进行以下两种操作:

  • 选定整数 \(k(1\le k\le n)\) 与不下降非负序列 \(c_1,c_2,\dots,c_k\),对所有 \(1\le i \le k\),令 \(a_i\) 加上 \(c_i\)。
  • 选定整数 \(k(1\le k\le n)\) 与不上升非负序列 \(c_1,c_2,\dots,c_k\),对所有 \(1\le i \le k\),令 \(x_{N-k+i}\) 加上 \(c_i\)。

问最少进行多少次操作使得最后对任意 \(i\) 有 \(x_i=A_i\)。\(n\le 2\times 10^5,A_i\le 10^9\)。

view solution

首先前后缀操作显然可以转化为对原序列任意一个区间,增加一个不下降序列或不上升序列。

另一个重要结论是:存在一种最优方案使得同一种操作的所有区间互不相交。证明考虑调整法,对于相交的两个区间,直接将相交的部分叠加到某一个操作上即可。

于是可以对位置 \(i\) 设 \(b_i\) 表示操作 1 对位置 \(i\) 的贡献,\(c_i\) 表示操作 2 对位置 \(i\) 的贡献。如果 \(b_i,c_i\) 已经确定,那么接下来就只需要将 \(b_i\) 拆分成若干个不下降子序列,\(c_i\) 拆分成若干个不上升子序列,于是操作数 \(=\sum_{i=1}^{n}[b_i>b_{i+1}]+[c_i<c_{i+1}]\)。

对于这一问题就可以设 \(dp\) 状态 \(f_{i,j}\) 表示考虑了前 \(i\) 个位置,\(b_i=j\) 时的最小操作数,有:

\[f_{i,j}=\min_{k}f_{i-1,k}+[k>j]+[a_{i-1}-k<a_{i}-j]\\ =\min_{k}f_{i-1,k}+[k>j]+[k>a_{i-1}-a_{i}+j] \]

因此 \(f_{i,j}\) 是随着 \(j\) 的增加单调不增的并且 \(f_{i,0}\le f_{i,a_i}+2\)。因此我们只需要维护 \(f_{i,j}=f_{i,a_i}+2,f_{i,a_i}+1,f_{i,a_i}\) 的三个 \(j\) 的区间即可。

AGC040D - Balance Beam

给定 \(n\) 条长度为 \(1\) 的边,A 通过第 \(i\) 条边的速度为 \(\dfrac{1}{a_i}\),B 通过第 \(i\) 条边的速度为 \(\dfrac{1}{b_i}\)。

现在 A 可以对着 \(n\) 条边进行排序组成一条链,然后 A 从左端点出发,B 在链上随机一个实数点出发向右走,问 A 能追上 B 的概率最大是多少。\(n\le 10^5\)。

view solution

对于这种位移固定的行程问题,考虑作出时间-位移图象(时间是纵坐标),那么 A 和 B 的行进路线就是从 \((0,0)\) 出发,分别到 \((n,\sum a_i)\) 与 \((n,\sum b_i)\) 的两条折线。

接下来将 B​ 的图象向下平移直到再平移就不与 A 图象相交为止。若此时 B 图象与 \(x\) 轴交点为 \((p,0)\),那么答案就是 \(\dfrac{p}{n}\)。问题转化为如何最大化 \(p\)。考虑从 \((p,0)\) 出发,先沿 B 图象走,走到与 A 的交点时就改为走 A 图象,最终走到 \((n,\sum a_i)\)。于是最大化 \(p\) 相当于要最大化从 \((p,0)\) 到 \((n,\sum a_i)\) 的平均斜率。

枚举 \(p\) 所在的边 \(x\),那么如果将边 \(i\) 放在 \(x\) 后面,它至多贡献 \(\max(a_i,b_i)\) 的斜率。于是将所有边按 \(\max(a_i,b_i)\) 排序,选择一个后缀放在 \(x\) 后,可以发现一定可以通过将它们按 \(a_i-b_i\) 排序使得贡献全部取到 \(\max(a_i,b_i)\)。于是可以通过二分找到最小的后缀满足 \(\sum \max(a_i,b_i)>\sum a_i-b_x\)。然后就可以算出 \(p\) 的大小更新答案了。复杂度为 \(\mathcal O(n\log n)\)。

AGC040F - Two Pieces

AGC030

标签:atcoder,le,记录,sum,做题,序列,2n,排序,dp
来源: https://www.cnblogs.com/tqxboomzero/p/16178417.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有