观察性质计数题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. ASP.NET Core 6框架揭秘-实例演示版[持续更新中…]

    作为<ASP.NET Core 3框架揭秘>的升级版,<ASP.NET Core 6框架揭秘>提供了很多新的章节,同时对现有的内容进行大量的修改.虽然本书旨在对ASP.NET ...

  2. [LeetCode]771. 宝石与石头

    给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. J 中的字母不重复,J 和 S中的所有字符都是字母 ...

  3. 图解AI数学基础 | 概率与统计

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/83 本文地址:http://www.showmeai.tech/article-det ...

  4. ASP.NET Core 6框架揭秘实例演示[10]:Options基本编程模式

    依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式注入消费该功能的组件或者服务中.除了可以采用依赖注入的形式消费承载某种功能的服务,还可以采用相同的方式消费承载配置数据的Options对 ...

  5. [c/c++]c++控制台操作(基本操作的代码)

    本文转自:http://blog.csdn.net/stude/article/details/7645056 控制台窗口界面编程控制 〇.摘要一.概述二.控制台文本窗口的一般控制步骤三.控制台窗口操 ...

  6. 还在被数据分析报告折磨?Smartbi让你解放双手

    数据分析报告贯穿了企业经营的时时刻刻,方方面面. 数据分析报告最常用于汇报分享:团队需要分享.沟通,数据分析师需要洞察数据.分析结果分享给企业领导.团队同事.大众媒体及更多的利益相关方. 数据分析报告 ...

  7. 通过修改profile 来修改账号的过期时间

    转至:https://blog.csdn.net/xxzhaobb/article/details/80026028 查看账号的过期时间 SYS@test>select username,exp ...

  8. Python之ini配置文件详解

    INI介绍 INI是英文"初始化"(initialization)的缩写,被用来对操作系统或特定程序初始化或进行参数设置.由节(section). 键(key).值(value)构 ...

  9. Linux网卡ifcfg-eth0配置详解

    DEVICE="eth1"                              网卡名称 NM_CONTROLLED="yes"            n ...

  10. 微信小程序断网处理

    wx.onNetworkStatusChange(function callback) 参数 function callback 网络状态变化事件的回调函数 参数 Object res 属性 类型 说 ...