题目链接: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. 导出excel 各 cvs 的方法

    public function orderExcelExport($data,$filename='simple.xls'){ ini_set('max_execution_time', '0'); ...

  2. 《剑指offer》算法题第六天

    今日题目: 顺时针打印矩阵 包含min函数的栈 栈的压入.弹出序列 从上到下打印二叉树 二叉树搜索树的后序遍历序列 二叉树中和为某一值的路径 今天的题目都比较简单,下面一一介绍: 1. 顺时针打印矩阵 ...

  3. noi.ac #553 序列

    [题目描述] 老虎和蒜头是好朋友. 众所周知,蒜头经常给老虎出一些题目,而老虎也常常被难倒,作为捧杯之王的老虎难免心有怨怼.今天,老虎发现了蒜头的一个序列 a​ .虽然老虎不知道这个序列是用来做什么的 ...

  4. 文件操作(stat)

    /*** stat.c ***/ #include<stdio.h> #include<string.h> #include<sys/stat.h> #includ ...

  5. AtCoder AGC005E Sugigma: The Showdown (博弈论)

    题目链接 https://atcoder.jp/contests/agc005/tasks/agc005_e 题解 完了真的啥都不会了-- 首先,显然如果某条A树的边对应B树上的距离大于等于\(3\) ...

  6. AtCoder AGC009E Eternal Average (DP)

    题目链接 https://atcoder.jp/contests/agc009/tasks/agc009_e 题解 又被劝退了... 第一步转化非常显然: 就等价于一开始有一个数\(1\), 有\(\ ...

  7. node链接mongoDB及封装

    // 这个模块中封装所有对数据库的常用操作 const MongoClient = require('mongodb').MongoClient; const assert = require('as ...

  8. shiro 自定义filter

    1.自定义登录filter package com.creatunion.callcenter.filter; import com.alibaba.fastjson.JSONObject; impo ...

  9. IDEA:Process finished with exit code -1073741819 (0xC0000005)

    出门左转:https://www.cnblogs.com/virgosnail/p/10335224.html

  10. Button.OnClientClick

    Button.OnClientClick Gets or sets the client-side script that executes when a Button control's Click ...