题目链接:https://ac.nowcoder.com/acm/contest/882/E

题意:n×m的矩阵,0表示可以走,1表示墙,不能通过。有q中操作,一种是改变坐标(x,y)的状态,一种是询问从(1,x)到(n,y)有多少条路径。(n,q<=5e4,m<=10)。

思路:dp、矩阵乘加线段树维护。

   dp[i][j]表示从第i行到(i,j)的路径数。则dp[i][j]=sum(dp[i][k](k<=j)) + sum(dp[i][k](k>j))。

     

   比如上图,dp[1][2]=dp[1][1]+dp[1][2]+dp[1][3]。

        dp[1][6]=dp[1][5]+dp[1][6]。

   因此第x行到第y行的路径数可以用转移矩阵表示,比如从第1行到第1行的转移矩阵为:

    

   其中第1行第3列的1表示从(1,1)到(1,3)有1条路经。

   用线段树维护矩阵的乘积,修改为单点修改,复杂度为O(m^3*logn),树根维护的是M1*...*Mn,即第1行到第n行的路径数,所以查询复杂度为O(1)。

   

AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; typedef long long LL;
const int maxn=;
const int MOD=1e9+; struct Mat{
LL mat[][];
}; struct node{
Mat M;
int l,r;
}tr[maxn<<]; int n,m,Q;
char s[];
int a[maxn][]; Mat Matmul(Mat& a,Mat& b){
Mat c;
for(int i=;i<=m;++i)
for(int j=;j<=m;++j){
c.mat[i][j]=;
for(int k=;k<=m;++k){
c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]%MOD;
c.mat[i][j]%=MOD;
}
}
return c;
} void Matupd(int v,int x){
memset(tr[v].M.mat,,sizeof(tr[v].M.mat));
for(int i=;i<=m;++i)
if(!a[x][i]){
tr[v].M.mat[i][i]=;
for(int j=i-;j>=&&!a[x][j];--j)
tr[v].M.mat[j][i]=;
for(int j=i+;j<=m&&!a[x][j];++j)
tr[v].M.mat[j][i]=;
}
} void pushup(int v){
tr[v].M=Matmul(tr[v<<].M,tr[v<<|].M);
} void build(int v,int l,int r){
tr[v].l=l,tr[v].r=r;
if(l==r){
Matupd(v,l);
return;
}
int mid=(l+r)>>;
build(v<<,l,mid);
build(v<<|,mid+,r);
pushup(v);
} void update(int v,int x){
if(tr[v].l==tr[v].r){
Matupd(v,x);
return;
}
int mid=(tr[v].l+tr[v].r)>>;
if(x<=mid) update(v<<,x);
else update(v<<|,x);
pushup(v);
} int main(){
scanf("%d%d%d",&n,&m,&Q);
for(int i=;i<=n;++i){
scanf("%s",s);
for(int j=;j<=m;++j)
a[i][j]=s[j-]-'';
}
build(,,n);
while(Q--){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==){
a[x][y]^=;
update(,x);
}
else
printf("%lld\n",tr[].M.mat[x][y]);
}
return ;
}

2019牛客暑期多校训练营(第二场)-E MAZE的更多相关文章

  1. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  2. 2020牛客暑期多校训练营 第二场 K Keyboard Free 积分 期望 数学

    LINK:Keyboard Free 我要是会正经的做法 就有鬼了. 我的数学水平没那么高. 三个同心圆 三个动点 求围成三角形面积的期望. 不会告辞. 其实可以\(n^2\)枚举角度然后算出面积 近 ...

  3. 2020牛客暑期多校训练营 第二场 J Just Shuffle 置换 群论

    LINK:Just Shuffle 比较怂群论 因为没怎么学过 置换也是刚理解. 这道题是 已知一个置换\(A\)求一个置换P 两个置换的关键为\(P^k=A\) 且k是一个大质数. 做法是李指导教我 ...

  4. 2020牛客暑期多校训练营 第二场 I Interval 最大流 最小割 平面图对偶图转最短路

    LINK:Interval 赛时连题目都没看. 观察n的范围不大不小 而且建图明显 考虑跑最大流最小割. 图有点稠密dinic不太行. 一个常见的trick就是对偶图转最短路. 建图有点复杂 不过建完 ...

  5. 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心

    LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...

  6. 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心

    LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...

  7. 2020牛客暑期多校训练营 第二场 A All with Pairs 字符串hash KMP

    LINK:All with Pairs 那天下午打这个东西的时候状态极差 推这个东西都推了1个多小时 (比赛是中午考试的我很困 没睡觉直接开肝果然不爽 一开始看错匹配的位置了 以为是\(1-l\)和\ ...

  8. 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem

    题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3  4 2 3 4 输出:0 0 1 题解: 认真想一 ...

  9. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  10. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

随机推荐

  1. 【Python之路】特别篇--Django生产环境部署

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. uWSGI uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中H ...

  2. VirtualBox 安装CentOS虚拟机网卡配置

    VirtualBox虚拟机网络设置(NAT+HOST-ONLY) 目标: 虚拟机可以像宿主机一样访问互联网和其他主机 宿主机和虚拟机可以相互访问 使用NAT实现目标一 使用Host-Only实现目标二 ...

  3. JQuery调用绑定click事件的3种写法

    第一种方式: $(document).ready(function(){ $("#clickme").click(function(){ alert("Hello Wor ...

  4. HGOI 20190830 题解

    Problem A 钥匙 有$n$个人和$m$个钥匙在数轴上,人的坐标为$a_i$,钥匙的坐标为$b_i$ 而门的坐标为$p$,要让所有人获得一把不同钥匙,并且到达门,最长时间最短是多少. 对于$10 ...

  5. Linux可变参数打印日志(二)

    #include<stdio.h> #include<stdlib.h> #include<stdarg.h> #include<string.h> # ...

  6. 编译报错:File ended while scanning use of xxx

    出现这个问题的原因是使用某些命令时,给出的参数不完整或者漏了半个大括号: 比如, Runaway argument? {adaptivity, dynamically changing environ ...

  7. ARTS打卡计划第一周

    Algorithms: https://leetcode-cn.com/problems/two-sum/ Review: https://www.infoq.cn/article/EafgGJEtq ...

  8. [心得]暑假DAY 5

    好久没更新博客了 最近事情太多太多 tarjan进阶,点双边双 T2压力 最大坑点:点双缩点 它不是直接把割点连成树(割点会有环) 而是用割点作”中介“,联接点双构成一颗树(所谓圆方树) 接着在上面进 ...

  9. TCP之RST报文段

    TCP 首部中的 RST 比特是用于 "复位" 的.一般来说,无论何时一个报文段发往基准的连接(referenced connection)出现错误,TCP 都会发出一个复位报文段 ...

  10. Windows上配置Mask R-CNN及运行示例demo.ipynb

    最近做项目需要用到Mask R-CNN,于是花了几天时间配置.简单跑通代码,踩了很多坑,写下来分享给大家. 首先贴上官方Mask R-CNN的Github地址:https://github.com/m ...