ABC 357 G Stair-like Grid

2024-06-09 22:36
文章标签 like grid abc 357 stair

本文主要是介绍ABC 357 G Stair-like Grid,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

link

其实是我之前写的一篇博客的推广
大意:
一个阶梯型,第 i i i行有 ⌈ i / 2 ⌉ ∗ 2 \left \lceil i/2 \right \rceil*2 i/22个方块,总共有n行。在其中给定 m m m个点无法经过,求从左上角到右下角的方案数。其中每次移动只能向右或向下
N ≤ 2.5 e 5 , M ≤ 50 N\leq 2.5e5,M\leq 50 N2.5e5,M50
在这里插入图片描述

思路:
一个比较显然的思路是把原图还原为 n × n n\times n n×n的矩阵,然后再添加 n − 2 n-2 n2个障碍 ( i , ⌈ i / 2 ⌉ ∗ 2 + 1 ) (i,\left \lceil i/2 \right \rceil*2+1) (i,i/22+1),这样就还原成了经典模型,可以直接用容斥来做。
还是将障碍按横纵坐标排个序,同时不妨将终点也放入 S S S中,显然排序后它会是最后一个点
S S S表示障碍的集合, d p i dp_i dpi表示从起点到第i个障碍,中间不经过其它障碍的方案数, w i w_i wi表示S中的第i个障碍, g ( ⋅ ) g(\cdot) g()表示两点之间的所有最短路的方案数(不考虑中间是否经过障碍)
不难得到一个非常naive的式子:
d p i = g ( ( 1 , 1 ) , w i ) − ∑ j < i g ( j , i ) d p j a n s = d p ∣ S ∣ + 1 dp_i=g((1,1),w_i)-\sum_{j<i}g(j,i)dp_j\\ ans = dp_{|S|+1} dpi=g((1,1),wi)j<ig(j,i)dpjans=dpS+1
但是这样做的时间复杂度是 O ( ( n + m ) 2 O((n+m)^2 O((n+m)2,尝试优化

首先对式子换一个好看点的形式:
f i = d p i f_i=dp_i fi=dpi,有
f i = − ( g ( ( 1 , 1 ) , w i ) − ∑ j < i g ( j , i ) d p j ) = − g ( ( 1 , 1 ) , w i ) − ∑ j < i g ( j , i ) f j = ∑ j = 0 i − 1 g ( w j , w i ) f j f_i=-(g((1,1),w_i)-\sum_{j<i}g(j,i)dp_j)=-g((1,1),w_i)-\sum_{j<i}g(j,i)f_j =\sum_{j=0}^{i-1}g(w_j,w_i)f_j fi=(g((1,1),wi)j<ig(j,i)dpj)=g((1,1),wi)j<ig(j,i)fj=j=0i1g(wj,wi)fj
这里我们把起点也加入了 S S S中,并令它为第0个点(显然合理)
从而
f i = ∑ j = 0 i − 1 g ( w j , w i ) f j , 0 ≤ i ≤ ∣ S ∣ + 1 a n s = − f ∣ S ∣ + 1 f_i=\sum_{j=0}^{i-1}g(w_j,w_i)f_j,0\leq i\leq |S|+1\\ ans=-f_{|S|+1} fi=j=0i1g(wj,wi)fj,0iS+1ans=fS+1

注意到障碍总共可以分为两类:

  • 题目里原本就在的,数量为O(M)
  • 我们新加的,数量为O(N)

而M其实并不大,第一类的点最多带来 O ( M ( N + M ) ) O(M(N+M)) O(M(N+M))的复杂度,这部分我们可以直接暴力。此时我们需要优化的部分就是后者内部的 O ( N × N ) O(N\times N) O(N×N)的复杂度
对第二类点换一种记法:
w i , 1 = ( 2 i − 1 , 2 i + 1 ) w i , 2 = ( 2 i , 2 i + 1 ) w_{i,1}=(2i-1,2i+1)\\ w_{i,2}=(2i,2i+1) wi,1=(2i1,2i+1)wi,2=(2i,2i+1)
我们先假设第一类点的贡献已经统计完了( w i , 1 , w i , 2 w_{i,1},w_{i,2} wi,1,wi,2之间的贡献也可以在这里算好,复杂度 O ( N ) O(N) O(N)),那么此时
f i , 1 = f i , 1 − ∑ j < i f j , 1 g ( w j , 1 , w i , 1 ) + f j , 2 g ( w j , 2 , w i , 1 ) f i , 2 = f i , 2 − ∑ j < i f j , 1 g ( w j , 1 , w i , 2 ) + f j , 2 g ( w j , 2 , w i , 2 ) f_{i,1} =f_{i,1}- \sum_{j<i}f_{j,1}g(w_{j,1},w_{i,1})+f_{j,2}g(w_{j,2},w_{i,1})\\ f_{i,2} =f_{i,2}- \sum_{j<i}f_{j,1}g(w_{j,1},w_{i,2})+f_{j,2}g(w_{j,2},w_{i,2})\\ fi,1=fi,1j<ifj,1g(wj,1,wi,1)+fj,2g(wj,2,wi,1)fi,2=fi,2j<ifj,1g(wj,1,wi,2)+fj,2g(wj,2,wi,2)
注意到这里 g ( ⋅ ) g(\cdot) g()的含义其实非常好求,因为它不需要考虑中间经过的点的类型,我们把它写出来
g ( w j , 2 , w i , 1 ) = ( 4 ( i − j ) − 1 2 ( i − j ) ) g ( w j , 1 , w i , 1 ) = g ( w j , 2 , w i , 2 ) = ( 4 ( i − j ) 2 ( i − j ) ) g ( w j , 1 , w i , 2 ) = ( 4 ( i − j ) + 1 2 ( i − j ) ) g(w_{j,2},w_{i,1}) = \binom{4(i-j)-1}{2(i-j)}\\ g(w_{j,1},w_{i,1}) = g(w_{j,2},w_{i,2})= \binom{4(i-j)}{2(i-j)}\\ g(w_{j,1},w_{i,2}) = \binom{4(i-j)+1}{2(i-j)} g(wj,2,wi,1)=(2(ij)4(ij)1)g(wj,1,wi,1)=g(wj,2,wi,2)=(2(ij)4(ij))g(wj,1,wi,2)=(2(ij)4(ij)+1)
不难发现它们其实都可以表示成 ( i − j ) (i-j) (ij)的函数,那么显然上述式子就可以用fft来优化了,从而这部分的时间复杂度来到了 O ( N l o g 2 N ) O(Nlog^2N) O(Nlog2N)
所以总体复杂度为 O ( M ( N + M ) + N l o g 2 N ) O(M(N+M)+Nlog^2N) O(M(N+M)+Nlog2N)
over
(退役口胡选手不想敲代码…

那么理论上这种题目也是可以推广的,任意形状的阶梯型我们都可以用同样的复杂度来求解,哪怕有多条边有阶梯形也没有关系(只要中间没有洞)

这篇关于ABC 357 G Stair-like Grid的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046484

相关文章

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>

LibSVM学习(六)——easy.py和grid.py的使用

我们在“LibSVM学习(一)”中,讲到libSVM有一个tools文件夹,里面包含有四个python文件,是用来对参数优选的。其中,常用到的是easy.py和grid.py两个文件。其实,网上也有相应的说明,但很不系统,下面结合本人的经验,对使用方法做个说明。        这两个文件都要用python(可以在http://www.python.org上下载到,需要安装)和绘图工具gnup

Mybatis like 模糊查询,有数据,但是就是查询不出来

今天修改项目遇到的问题,mybatis模糊查询,有数据,就是查不出来。也不报错。 问题虽然最后搞定了,来总结下。 Mybatis配置如下:<select id="getAll" resultMap="OaEmplyeeInfoResultMap"parameterType="com.deppon.oa.module.oaEmplyeeInfo.domain.OaEmplyeeInfo"

js中怎样对“abc”进行MD5、sha256哈希计算?

在 JavaScript 中,可以使用 CryptoJS 库来进行 MD5 哈希计算。首先,你需要在 HTML 文件中导入 CryptoJS 库,例如: <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script> 然后,在 JavaScript 文件中,可

2024国赛数学建模ABC题思路模型

完整的思路模型请查看文末名片 完整的思路模型请查看文末名片 完整的思路模型请查看文末名片

【ZOJ】3881 From the ABC conjecture【暴力容斥】

传送门:【ZOJ】3881 From the ABC conjecture 复杂度大概 O(N0.67) O(N^{0.67}),我也不会算www,首先转换一下(我们是根据积性函数打表找规律得到的,也可以推出来)使得: g(N)=∏pi ϵ N(pia+1) g(N)=\prod_{pi~\epsilon ~N} (pi^a+1) 暴力展开发现贡献为: h(N)=

extjs 获取grid的选中行的某列的值

我的情景是这样的:一个grid(就叫gridA吧),最后一列的每行都是超链接,点击超链接时会弹出一个窗体,这个窗体也需要一个grid(gridB)展示,并且呢,gridB所需的数据需要gridA里的某列的值(把这个列叫做Param)作为参数。于是就产生了点击gridA的某行的超链接,获取该行的Param列的值这样的需求。 不知道为什么,我用var param=this.grid..getSe

Extjs Grid 根据列的值(0或者1)显示“是或否”

grid中:{header:'是否解析',dataIndex:'isExplain',align:'center',sortable: true,renderer:isResend}, 写一个函数: function isResend(data, metadata, record){ var resend; if(record.data.isExplain==0){resend="否";

extjs中grid,设置CheckboxSelectionModel的默认值

Grid(命名为BasicGrid)中定义了:this.sm = new Ext.grid.CheckboxSelectionModel();。表示一列checkBox。 情景:上面Grid所在的窗口弹出之后,选择一项(我这里是只选一项)点击确定之后关闭该窗口。当需要再次弹出该窗口时,把刚刚已经选择的那一项打上勾。下面是方法:我是写在弹出该窗口的方法中的。