原题链接

鸣谢:AGC 018E.Sightseeing Plan(组合 DP)

本蒟蒻认为,本题堪称网格路径问题观止。

因为涵盖了不少网格路径问题的处理方法和思路。

一句话题意:

给你三个矩形。

三个矩形从左下到右上排开。矩形顶点坐标范围是1e6

  • 1≤X1≤X2<X3≤X4<X5≤X6≤106
  • 1≤Y1≤Y2<Y3≤Y4<Y5≤Y6≤106

大概就是这样:

对于所有的1中选择一个点P1,2中选择一个点P2,3中选择一个点P3。

求从P1到P2再到P3的最短路径条数之和。

从一个矩形再到另外一个矩形还要经过一个矩形太复杂。我们化简情况处理下。

反正本质就是所有三个点之间的路径。

一、一个点到一个点

你必须要知道的:

从(x1,y1)到(x2,y2)的最短路径,就是只能往上或者往右走。

最短路径条数就是:C(x2-x1+y2-y1,x2-x1)

所以我们可以O(1000000^6)枚举

二、一个点到一个矩形

$F(x,y)$表示,从$(0,0)$到$(x,y)$的路径条数。

这个可以直接算。

发现,

$F(x,y)=\sum_{j=0}^yF(x-1,j)$

可以理解为,从原点到所有的$(x-1,j)$然后向上走一步,然后直接向右到达$(x,y)$

肯定不重不漏。

那么,可以得到:

从$(0,0)$到一个矩阵路径,就是:

$F(x2+1,y2+1)-F(x2+1,y1)-F(x1,y2+1)+F(x1,y1)$

就是一个小容斥。

用上面的$F(x,y)=\sum_{j=0}^yF(x-1,j)$

把$F(x2+1,y2+1)$还有$F(x1,y2+1)$展开消一消,

每次保留$F(x2+1,j)$和$F(x1,j)$往下消。

画画图就看出来了。

所以,我们得到了从一个点到一个矩阵的路径条数。

只要计算那四个点即可。

三、一个矩形到一个矩形

列出式子:

$G$示路径条数

$M_1$代表第一个矩形,$M_2$代表第二个矩形。

$\sum_{x1} \sum_{y1} \sum_{x2} \sum_{y2}G((x1,y1),(x2,y2))$

可以提出两个sigma

变成枚举一个点,求到另外一个矩形的方案数

$\sum_{x1} \sum_{y1}G((x1,y1),M_2)$

其实就是:

$\sum_{x1} \sum_{y1}\sum_{xx}\sum_{yy}(G((x1,y1),(xx,yy))$

$xx,yy$代表那四个关键点。(省略了四个关键点正负号)

反过来,每个关键点都会被$M_1$所有的点统计一次。

所以,一个关键点的贡献,就是这个关键点到$M_1$的路径条数。

就是这个关键点到$M_1$的四个关键点路径条数。(当然,要有正负号)

所以,一个矩形到一个矩形的路径条数,

就是两个矩形四个关键点分别进行条数计算。处理好符号即可。

四、一个矩形经过一个矩形再到另一个矩形

可以把三的结论推广。

就是,第一个矩形四个关键点,到第三个矩形四个关键点,然后路径上经过第二个矩形的方案数。

所以,$4\times 4$枚举第一第三个矩形的关键点的话,

问题就变成了从一个点出发,经过一个矩形再到另外一个点的方案数。

直接枚举还是$O(n^2)$的。

发现,经过第二个矩形,
必然要么从$(x,y3)$(下边界)要么从$(x3,y)$(左边界)
进入。

所以,我们枚举进入点。

进入这个点,就一定进入了这个矩形。再到终点的任意一条路径,都是合法的。

再乘上从起点到这个进入点的方案数就是这个进入点的贡献。

必然不重不漏地枚举完了所有的合法路径。

所以我们成功的A掉了这个题。

五、然鹅并没有做完。。。

发现,不是要求经过第二个矩形的路径条数啊,我们要在第二个矩形中选择一个点。。。。

一个经过第二个矩形的长度为$len$的路径,就对应着$len$个方案。(每个位置都可以作为$P_2$)

我们经常转化研究对象,尝试分开统计贡献。

分开统计的前提是,贡献必须可以处理成互不相关的形式。

这个可以不可以呢?

但是凉凉,这个$len$还和离开点有关。。。

难道只能$O(n^2)$枚举进入点和离开点?

不!我们还有方法!

一个$len$怎么计算?

进入点$(x1,y1)$,离开点$(x2,y2)$

有$len=x2-x1+y2-y1+1$

诶!!

$x1,x2,y1,y2$貌似可以分离!!

那么,我们可以枚举进入点。

贡献是:$(-1)\times$刚才的两个组合数$\times(x+y)$

离开点:

贡献是:$(+1)\times$刚才的两个组合数$\times(x+y)$

(其实这个也是不重不漏枚举了所有路径)

相加的话,

发现,对于每个合法的路径,恰好被计算了两遍。(进入离开点各一次)

第一遍把$-x1-y1$算上,

第二遍把$x2+y2+1$算上。

所以,每个合法路径贡献就是$len$次。和题意符合。

完结撒花!!!~~~

六、一些代码实现细节:

1.len的长度是:$(x2-x1+y2-y1+1)$别忘了$+1$

2.注意,矩阵矩阵的之间的路径,

根据推导,是先转化成$M_2$中关键点到$M_1$矩阵的路径,所以,$M_1$的矩阵的四个关键点分别是$(x1-1,y1-1),(x2,y1-1),(x1-1,y2),(x2,y2)$

类比之前,这个是从上往下走的,所以要这样处理。

#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long long ll;
const int mod=1e9+;
const int N=2e6+;
ll ans=;
ll jie[N],ni[N];
struct node{
int x,y,fl;
void init(int a,int b,int c){
x=a,y=b,fl=c;
}
}p[];
int tot;
int x3,y3,x4,y4;
int xx[],yy[];
ll qm(ll x,ll y){
ll ret=;
while(y){
if(y&) ret=ret*x%mod;
x=x*x%mod;
y>>=;
}
return ret;
}
ll C(int n,int m){
return jie[n]*ni[m]%mod*ni[n-m]%mod;
}
ll G(int x1,int y1,int x2,int y2){
ll A=abs(x2-x1),B=abs(y2-y1);
return C(A+B,B);
}
ll sol(int x1,int y1,int x2,int y2,int f1,int f2){
ll ret=;
for(ri x=x3;x<=x4;++x){
ret=(ret+G(x1,y1,x,y4)*G(x,y4+,x2,y2)%mod*(x+y4+))%mod;//注意这里的x+y4+1的+1
ret=(ret-G(x1,y1,x,y3-)*G(x,y3,x2,y2)%mod*(x+y3)%mod+mod)%mod;
}
for(ri y=y3;y<=y4;++y){
ret=(ret+G(x1,y1,x4,y)*G(x4+,y,x2,y2)%mod*(x4+y+))%mod;
ret=(ret-G(x1,y1,x3-,y)*G(x3,y,x2,y2)%mod*(x3+y)%mod+mod)%mod;
}
ret=ret*(f1*f2); return ret;
}
int main(){
int x,y;
for(ri i=;i<=;++i)scanf("%d",&xx[i]);
for(ri i=;i<=;++i)scanf("%d",&yy[i]);
jie[]=;
for(ri i=;i<=N-;++i) jie[i]=jie[i-]*i%mod;
ni[N-]=qm(jie[N-],mod-);
for(ri i=N-;i>=;--i) ni[i]=ni[i+]*(i+)%mod; x3=xx[],y3=yy[],x4=xx[],y4=yy[];
p[].init(xx[]-,yy[]-,);p[].init(xx[],yy[]-,-);//注意这里是这样的
p[].init(xx[]-,yy[],-);p[].init(xx[],yy[],); p[].init(xx[],yy[],);p[].init(xx[]+,yy[],-);
p[].init(xx[],yy[]+,-);p[].init(xx[]+,yy[]+,); for(int i=;i<=;++i){
for(int j=;j<=;++j){
ans=(ans+sol(p[i].x,p[i].y,p[j].x,p[j].y,p[i].fl,p[j].fl)+mod)%mod;
}
}
printf("%lld",ans);
return ;
}

七、总结

我们成功地把一个O(n^6)变成了O(n)

思路就是化简问题,然后从简单到困难,利用之前的结论考虑,不断转化简化问题。

最后的差分len也是异常精彩。

组合数和路径条数的问题,经常是考虑一个物品的贡献。

可以尝试往这方面想。

这里也有有一个不错的路径组合意义转化题:fzyzojP3782 -组合数问题

AGC 018E.Sightseeing Plan——网格路径问题观止的更多相关文章

  1. AGC 018E.Sightseeing Plan(组合 DP)

    题目链接 \(Description\) 给定三个不相交的矩形\(A(X1,Y1)-(X2,Y2),B(X3,Y3)-(X4,Y4),C(X5,Y5)-(X6,Y6)\),求 从第一个矩形中某点\(a ...

  2. DP问题练习2:网格路径数量计算问题

    DP问题练习2:网格路径数量计算问题 问题描述 有一个机器人的位于一个 m × n 个网格左上角. 机器人每一时刻只能向下或者向右移动一步.机器人试图达到网格的右下角. 问有多少条不同的路径? 样例: ...

  3. [NOI2005]维护数列——平衡树观止

    本题题解并不详细,不推荐大家看这一篇. 可以看这篇 题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格) 100%的数据中, ...

  4. 几何学观止(Lie群部分)

    上承这个页面,这次把Lie群的部分写完了 几何学观止-微分几何部分(20181102).pdf 我觉得其他部分(尤其是代数几何部分)我目前没有把握写得令自己满意,总之希望在毕业前能写完吧. 这次调整了 ...

  5. 几何学观止(Riemann流形部分)

    上承这个页面,相较之前,增加了古典的曲线曲面论,这部分介绍得很扼要,Riemann流形介绍得也很快,花了仅仅30页就介绍到了Gauss-Bonnet公式.同时配上了提示完整的习题. 几何学观止-Rie ...

  6. [AGC 018 E] Sightseeing plan

    STO ZKY ORZ Description 给定一张网格图和三个矩形,每次只能向上或向右走.你需要从矩形 \(A\) 中的一个点 \(S\) 出发,到达矩形 \(B\) 中的一个点 \(P\) , ...

  7. AtCoder Grand Contest 018 E Sightseeing Plan

    题意: 给定三个矩形,选定三个点,答案加上第一个点出发经过第二个点在第三个点结束的方案数,只能往右或往下走. 折腾了我半个多下午的题. 设三个矩形为$A,B,C$一个思路是枚举$B$的那个点$s(x, ...

  8. Python简介之探观止矣

    Python是一门什么样的编程语言编程语言主要分为编译型和解释型,静态语言和动态语言,强类型和弱类型,混合语言等.编译型语言:通过编译器把源代码编译(compile)成机器语言,在经过链接(linke ...

  9. CodeChef题目选讲

    https://wenku.baidu.com/view/2445a0322f60ddccda38a023.html 关键点:不超过7条 根据咕咕原理,所以答案最少是N/7;(N小于49就暴力) 随机 ...

随机推荐

  1. 20155210 EXP6 信息搜集与漏洞扫描

    20155210 EXP6 信息搜集与漏洞扫描 信息搜集 外围信息搜集 通过DNS和IP挖掘目标网站的信息 whois 域名注册信息查询 我们通过输入whois qq.com可查询到3R注册信息,包括 ...

  2. 浅谈Spring中的事务回滚

        使用Spring管理事务过程中,碰到过一些坑,因此也稍微总结一下,方便后续查阅. 1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控 ...

  3. 为你的机器学习模型创建API服务

    1. 什么是API 当调包侠们训练好一个模型后,下一步要做的就是与业务开发组同学们进行代码对接,以便这些‘AI大脑’们可以顺利的被使用.然而往往要面临不同编程语言的挑战,例如很常见的是调包侠们用Pyt ...

  4. 【第八课】php-fpm.conf配置文件解析

    在discuz论坛的nginx配置文件当中,我们可以看到有一段php解析的配置,如下: location ~ \.php$ { try_files $uri = 404; fastcgi_pass 1 ...

  5. 项目 - RM 部署上centos7 之后出现的一些问题和解决方法

    系统版本: [root@localhost logs]# cat /etc/redhat-release CentOS Linux release (Core) 获取方法来自:https://www. ...

  6. 测试leader职责

    一. 负责软件产品/项目测试工作的组织 参加软件产品开发前的需求调研和分析 根据需求规格说明书,概要设计和开发计划编写项目总体测试计划,详细测试计划,测试大纲和测试文档结构表[测试计划 a.已上线产品 ...

  7. Windows 7上安装配置TensorFlow-GPU运算环境

    Windows 7上安装配置TensorFlow-GPU运算环境 1. 概述 在深度学习实践中,对于简单的模型和相对较小的数据集,我们可以使用CPU完成建模过程.例如在MNIST数据集上进行手写数字识 ...

  8. 区块链扩容方案之Gas值限制

    区块链扩容一直是区块链团队的重点研究方向.因为比特币对区块大小的设定是固定的,而且中本聪将最初大小值限定为1M,但随着交易量的增加,网络拥堵情况也愈渐严重,最终也导致了比特币的分叉. 区别于比特币固定 ...

  9. BigDecimal的setScale()方法无效(坑)

    最近在使用BigDecimal进行四舍五入时,发现setScale()方法设置的精度值并没有起作用,一度让我怀疑起是否jdk有bug,代码如下: 错误代码 double d = 7.199999999 ...

  10. jqGrid属性中文详细说明

    jqGrid属性中文详细说明 jqGrid的属性很多,其实很大部分的属性,使用其默认值就可以了.但是详细了解一下属性的含义以及作用,对我们定制自己的grid是有帮助的. 以下内容描述格式是:属性名称 ...