【Atcoder】AGC019 B-F简要题解

96 篇文章 0 订阅
32 篇文章 0 订阅

B.Reverse and Compare

以每个位置和每个位置之间为对称看,答案=不相同字符对数+1。


C.Fountain Walk

扇形环可以使得答案减少 20 − 5 π 20-5\pi 205π,半圆环使得答案增加 10 π − 20 10\pi-20 10π20,但绕路去走扇形环绝对不优。

所有在起终点之间按离散化后的 x x x值为下标,求解LIS。

当每行或者每列都有障碍且构成一整个LIS时,不得不走一个半圆环。


*D.Shift and Flip

∣ A ∣ , ∣ B ∣ ≤ 2000 |A|,|B|\leq 2000 A,B2000,明示枚举最终循环右移的位数。(套路)

设最终 ∣ A ∣ |A| A循环右移了 k ( − ∣ A ∣ 2 &lt; k ≤ ∣ A ∣ 2 ) k(-\frac {|A|}2&lt;k\leq \frac {|A|}{2}) k(2A<k2A)位,则 A ′ [ i ] = B [ i + k ] A&#x27;[i]=B[i+k] A[i]=B[i+k],即哪些位需要改变。
k &lt; 0 k&lt;0 k<0的情况直接把 A , B A,B A,B翻转转成 − k -k k

设在操作过程中最大右移 m x ( x ≥ k ) mx(x\geq k) mx(xk)位,最小右移 m n ( m n ≤ 0 ) mn(mn\leq 0) mn(mn0)位,设每个需要改变的位置 x x x在原位时左侧离它最近的 B i = 1 B_i=1 Bi=1的距离为 l x l_x lx,右侧离它最近的 B i = 1 B_i=1 Bi=1的位置距离为 r x r_x rx

答案就是求解最小的 m x + m n mx+mn mx+mn满足对于每个需要改变的位置 x x x l x ≤ − m n l_x\leq -mn lxmn r x ≤ m x r_x\leq mx rxmx
l l l排序后扫一下即可。


*E.Shuffle and Swap

DP做法 O ( n 2 ) O(n^2) O(n2)

把每个位置看做点,并将点分类:

  • A i = B i = 1 A_i=B_i=1 Ai=Bi=1的点为公共点。 s w a p ( A a k , A b k ) ( a k = i ) swap(A_{a_k},A_{b_k})(a_k=i) swap(Aak,Abk)(ak=i)后,还有其他位置能把 i i i 1 1 1填回来
  • A i = 1 , B i = 0 A_i=1,B_i=0 Ai=1,Bi=0的点为非公共点。 A i A_i Ai换走后,不能有 1 1 1填回来
  • A i = 0 , B i = 1 A_i=0,B_i=1 Ai=0,Bi=1的点为反非公共点。必须有 1 1 1填回来。

一个合法解的构图( a i a_i ai b i b_i bi连边):一些公共点组成的环+一些起点为非公共点,中间全是公共点,终点为反非公共点的链。

环不好算,可以 D P DP DP处理出链的信息,枚举有多少个公共点在链上:
d p [ i ] [ j ] dp[i][j] dp[i][j]表示 i i i个公共点, j j j个(反)非公共点组成 j j j条链的方案数,转移

d p [ i ] [ j ] = d p [ i − 1 ] [ j ] × i × j + d p [ i ] [ j − 1 ] × j × j dp[i][j]=dp[i-1][j]\times i\times j+dp[i][j-1]\times j\times j dp[i][j]=dp[i1][j]×i×j+dp[i][j1]×j×j

前一个系数 i / j i/j i/j表示新赋的标号,后一个系数 j / j j/j j/j表示位置

x , y x,y x,y分别为公共点,非公共点的个数,则

a n s = ∑ i = 0 x d p [ i ] [ y ] ( ( x − i ) ! ) 2 ( x i ) ( x + y x − i ) ans=\sum\limits_{i=0}^x dp[i][y]((x-i)!)^2\dbinom{x}{i}\dbinom{x+y}{x-i} ans=i=0xdp[i][y]((xi)!)2(ix)(xix+y)

实际复杂度 ( n 2 ) 2 = 500 0 2 (\dfrac{n}{2})^2=5000^2 (2n)2=50002

NTT+快速幂:

模数明示NTT。

题解
(大概是转成期望?)


*F.Yes or No

STOwxh010910

妙到不行!

首先设 n ≥ m n\geq m nm

d p [ n ] [ m ] dp[n][m] dp[n][m]转成网格图就变成了点 ( n , m ) (n,m) (n,m)到点 ( 0 , 0 ) (0,0) (0,0)中的期望贡献。

画一条 y = x y=x y=x的斜线,先不考虑从斜线上出发的贡献:

  • y = x y=x y=x之上时向下走有1的贡献;在 y = x y=x y=x之下时向左走有1的贡献。
  • 所有不从斜线出发的步的总贡献 = n =n =n(每段拆开加起来就是 n n n)

发现从斜线上出发的步的贡献一定为 1 2 \frac 12 21

枚举对角线上点,它的贡献就是 经 过 该 点 的 路 径 数 总 路 径 数 × 1 2 \dfrac{经过该点的路径数}{总路径数}\times \dfrac 12 ×21

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值