观察性质计数题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 (计数)的更多相关文章

  1. 【CF1225E Rock Is Push】推岩石

    题目描述 你现在在一个\(n×m\)的迷宫的左上角(即点\((1,1)\)),你的目标是到达迷宫的右下角(即点\((n,m)\)).一次移动你只能向右或者是向下移动一个单位.比如在点\((x,y)\) ...

  2. 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 ...

  3. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

  4. CF1225E题解 Rock Is Push

    在打CF的时候没想到www这个dp真的蛮巧妙的 这是一道dp题(废话 假设我们走到了\((i,j)\)位置,因为我们只能下移/右移,那么我们所有上方与左方的石块(即\(\{ (i,j)|i<n ...

  5. cf rock is push 【dp】

    附上学习的博客:https://blog.csdn.net/u013534123/article/details/102762673 大致题意:一个迷宫,里面有很多箱子,你可以向右或者向下走.当你遇到 ...

  6. Codeforces 1247E. Rock Is Push

    传送门 显然考虑 $dp$ ,设 $fx[i][j]$ 表示从 $(i,j)$ 出发往下走一格,最终到达 $(n,m)$ 的方案数,$fy[i][j]$ 表示从 $(i,j)$ 出发往右走一格,最终到 ...

  7. 【CF1247E】Rock Is Push(DP,二分)

    题意:有一个n*m的方格,每一格可能为空也可能有石头,要从(1,1)走到(n,m),每次可以往右或往下走 每次走的时候都会将自己面前的所有石头向移动方向推一格,如果碰到了边界就推不过去 问方案数模1e ...

  8. some problem

    CF1257F Make Them Similar $solution:$ 折半搜索后考虑如何维护两个数组的和,可以将 $A$ 中每个数减 $A_1$ ,$B$ 中每个数被减 $B_1$ ,$map$ ...

  9. 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. 题解:很显然只有 \( ...

随机推荐

  1. 以鶸ice为例,手撸一个解释器(一)明确目标

    代码地址 # HelloWorld.ice print("hello, world") 前言(废话) 其实从开始学习编译原理到现在已经有快半年的时间了,但是其间常常不能坚持看下去龙 ...

  2. Argo workflow 案例练习和配置详细解析

    参数化 - parameters hello-world-parameters.yaml文件解析 apiVersion: argoproj.io/v1alpha1 kind: Workflow met ...

  3. CentOS8 固定IP无法访问外网问题解决(ping: www.hao123.com: Name or service not known)

    CentOS8虚拟机用了一段时间后,需要安装telnet-server服务,却无法正常安装.之前安装ftp服务是没有问题的,安装问题如下: 错误提示,无法下载相关元数据:网上也是0.0B/s.那么可能 ...

  4. Redis 中 String 类型的内存开销比较大

    使用 String 类型内存开销大 1.简单动态字符串 2.RedisObject 3.全局哈希表 使用 Hash 来存储 总结 参考 使用 String 类型内存开销大 如果我们有大量的数据需要来保 ...

  5. 【C#集合】Hashtable 和 Dictionary的区别

    Hashtable 和 Dictionary <K, V> 类型 1):单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分. 2):Diction ...

  6. Oracle子查询临时表

    ORACLE 临时表,可以有两种类型的临时表:会话级临时表.事务级临时表. 会话级临时表: 因为这个临时表中的数据和你的当前会话有关系,当你当前 SESSION 不退出的情况下,临时表中的数据就还存在 ...

  7. oracle 11g rac修改监听端口(远程监听和本地监听)

    转至:https://www.cnblogs.com/yj411511/p/12459533.html 目录 1.修改远程监听端口 1.1 查看远程监听状态 1.2 修改SCAN listener端口 ...

  8. linux光盘使用、rpm软件包、yum软件仓库安装使用

    转至:https://blog.51cto.com/zpeng/1532520 一.光盘文件使用 1,RHEL5(x86_64)光盘结构 Cluster              //集群二进制包 C ...

  9. Linux 启动、停止、重启jar包脚本

    转至:https://www.cnblogs.com/foolash/p/13824647.html startOrStropJar.sh #!/bin/bash #这里可替换为你自己的执行程序,其他 ...

  10. oj教程--贪心

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是 ...