CF1225E Rock Is Push (计数)
观察性质计数题orz小贺
考场上跟榜才切
我们只能往下和往右走,那么只有连续的往下和往右可能会造成不合法的情况!如果当前这一步是向右,那么只有它前面连续的一段向右可能影响到它。
考虑把连续的向右/下一起处理,使得只有右和下之间相互转移。
假设向下走到达当前点\((i,j)\),接下来向右走若干段,那么能走的格数只和它右面的箱子数有关。而且能到达的位置是连续的一段
向右走到达当前点同理
点数是\(O(n^{2})\)的,每个方向可能转移到\(O(n)\)个位置,暴力转移是\(O(n^{3})\)的。因此需要前缀和打差分优化,时间优化成\(O(n^{2})\)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ull unsigned long long
#define ll long long
#define dd long double
using namespace std;
const int N1=2e3+5, p=1e9+7;
template <typename _T> void read(_T &ret)
{
ret=0; _T fh=1; char c=getchar();
while(c<'0'||c>'9'){ if(c=='-') fh=-1; c=getchar(); }
while(c>='0'&&c<='9'){ ret=ret*10+c-'0'; c=getchar(); }
ret=ret*fh;
}
int n,m;
char str[N1][N1];
int a[N1][N1];
int qa(int ax,int ay,int bx,int by)
{
return a[bx][by]-a[ax-1][by]-a[bx][ay-1]+a[ax-1][ay-1];
}
ll f[N1][N1][2],g[N1][N1][2],ysum[N1];
int main()
{
// freopen("a.in","r",stdin);
// freopen("e0.out","w",stdout);
read(n); read(m);
if(n==1&&m==1){ puts("1"); return 0; }
for(int i=1;i<=n;i++) scanf("%s",str[i]+1);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
{
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
a[i][j]+=(str[i][j]=='R');
}
g[1][1][0]=1; g[1][2][0]=p-1;
g[1][1][1]=1; g[2][1][1]=p-1;
for(int i=1;i<=n;i++)
{
//1->0
for(int j=1;j<=m;j++)
{
(ysum[j]+=g[i][j][1])%=p;
f[i][j][1]=ysum[j];
if(j==m) continue;
int r=m-qa(i,j+1,i,m);
(g[i][j+1][0]+=f[i][j][1])%=p;
(g[i][r+1][0]+=-f[i][j][1]+p)%=p;
}
//0->1
ll xsum=0;
for(int j=1;j<=m;j++)
{
(xsum+=g[i][j][0])%=p;
f[i][j][0]=xsum;
if(i==n) continue;
int r=n-qa(i+1,j,n,j);
(g[i+1][j][1]+=f[i][j][0])%=p;
(g[r+1][j][1]+=-f[i][j][0]+p)%=p;
}
}
// for(int i=1;i<=n;i++,puts("")) for(int j=1;j<=m;j++) printf("%d ",a[i][j]);
// puts("");
// for(int i=1;i<=n;i++,puts("")) for(int j=1;j<=m;j++) printf("%lld ",f[i][j][0]);
// puts("");
// for(int i=1;i<=n;i++,puts("")) for(int j=1;j<=m;j++) printf("%lld ",f[i][j][1]);
// puts("");
ll ans=(f[n][m][0]+f[n][m][1])%p;
printf("%lld\n",ans);
return 0;
}
`
CF1225E Rock Is Push (计数)的更多相关文章
- 【CF1225E Rock Is Push】推岩石
题目描述 你现在在一个\(n×m\)的迷宫的左上角(即点\((1,1)\)),你的目标是到达迷宫的右下角(即点\((n,m)\)).一次移动你只能向右或者是向下移动一个单位.比如在点\((x,y)\) ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) E. Rock Is Push dp
E. Rock Is Push You are at the top left cell (1,1) of an n×m labyrinth. Your goal is to get to the b ...
- [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】
[CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...
- CF1225E题解 Rock Is Push
在打CF的时候没想到www这个dp真的蛮巧妙的 这是一道dp题(废话 假设我们走到了\((i,j)\)位置,因为我们只能下移/右移,那么我们所有上方与左方的石块(即\(\{ (i,j)|i<n ...
- cf rock is push 【dp】
附上学习的博客:https://blog.csdn.net/u013534123/article/details/102762673 大致题意:一个迷宫,里面有很多箱子,你可以向右或者向下走.当你遇到 ...
- Codeforces 1247E. Rock Is Push
传送门 显然考虑 $dp$ ,设 $fx[i][j]$ 表示从 $(i,j)$ 出发往下走一格,最终到达 $(n,m)$ 的方案数,$fy[i][j]$ 表示从 $(i,j)$ 出发往右走一格,最终到 ...
- 【CF1247E】Rock Is Push(DP,二分)
题意:有一个n*m的方格,每一格可能为空也可能有石头,要从(1,1)走到(n,m),每次可以往右或往下走 每次走的时候都会将自己面前的所有石头向移动方向推一格,如果碰到了边界就推不过去 问方案数模1e ...
- some problem
CF1257F Make Them Similar $solution:$ 折半搜索后考虑如何维护两个数组的和,可以将 $A$ 中每个数减 $A_1$ ,$B$ 中每个数被减 $B_1$ ,$map$ ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)
A - Forgetting Things 题意:给 \(a,b\) 两个数字的开头数字(1~9),求使得等式 \(a=b-1\) 成立的一组 \(a,b\) ,无解输出-1. 题解:很显然只有 \( ...
随机推荐
- Solution -「CF 1370F2」The Hidden Pair (Hard Version)
\(\mathcal{Description}\) Link (hard) & Link (easy). 这是一道交互题. 给定一棵 \(n\) 个结点的树,其中有两个是特殊结点. ...
- Linux 下 Git版本升级
一.下载需要安装的版本号 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.24.0.tar.gz 二.安装需求 yum ...
- Python中编码encode()与解码decode()
1 print('这是编码'.encode('utf-8')) # 结果 b'\xe8\xbf\x99\xe6\x98\xaf\xe7\xbc\x96\xe7\xa0\x81' 2 print('这是 ...
- hbuilderx快捷键、回到上一步、回到上次编辑处
快捷键:Alt + 左/右箭头 其他快捷键:
- leetcode算法13.罗马数字转整数
哈喽!大家好,我是[学无止境小奇],一位热爱分享各种技术的博主! [学无止境小奇]的创作宗旨:每一条命令都亲自执行过,每一行代码都实际运行过,每一种方法都真实实践过,每一篇文章都良心制作过. [学无止 ...
- 【C# Task】 ValueTask/Task<TResult>
概要 1.如果异步方法的使用者使用 Task.WhenAll 或 Task.WhenAny,则在异步方法中使用 ValueTask<T> 作为返回类型可能会产生高昂的成本.这是因为您需要使 ...
- 【C#】String| StringBuilder 字符
原文链接:https://www.cnblogs.com/huameitang/p/10528646.html 字符串是用于表示文本的字符的有序集合. String对象是对象的有序集合 System. ...
- md5非对称密钥
一.MD5加密概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 13 ...
- 60天shell脚本计划-5/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月16日 --修改时间:2021年2月20日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...
- 数仓建模—ID Mapping
早晨起床的时候,发现自己尿分叉,我没有多想,简单洗洗就匆忙出门.路过早餐店,我看到师傅熟练的拉扯一小块面团,拉至细长条,然后放入油锅中,不一会功夫,一根屎黄色的油条便出锅了,卖相不错.我在想,小到炸屎 ...