【线段树 矩阵乘法dp】8.rseq
题目分析
#include<bits/stdc++.h>
#define MO 998244353
const int maxn = ; struct Matrix
{
int a[][];
void init(int c, int spe)
{
// printf("spe:%d\n",spe);
a[][] = c, a[][] = , a[][] = 1ll*spe*c%MO;
a[][] = , a[][] = , a[][] = ;
a[][] = , a[][] = , a[][] = ;
}
}f[maxn<<];
int n,m; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
int qmi(int a, int b)
{
if (b <= -) return ;
int ret = ;
for (; b; b>>=,a=1ll*a*a%MO)
if (b&) ret = 1ll*ret*a%MO;
return ret;
}
void debug(Matrix t)
{
puts("------------------------------------");
for (int i=; i<; i++, puts(""))
for (int j=; j<; j++) printf("%d ",t.a[i][j]);
puts("------------------------------------");
}
Matrix mult(Matrix a, Matrix b)
{
Matrix ret;
ret.a[][] = , ret.a[][] = , ret.a[][] = ;
ret.a[][] = , ret.a[][] = , ret.a[][] = ;
ret.a[][] = , ret.a[][] = , ret.a[][] = ;
// debug(a);
// debug(b);
for (int k=; k<; k++)
for (int i=; i<; i++)
for (int j=; j<; j++)
ret.a[i][j] = (ret.a[i][j]+1ll*a.a[i][k]*b.a[k][j]%MO)%MO;
// debug(ret);
// puts("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
return ret;
}
void pushup(int rt)
{
f[rt] = mult(f[rt<<], f[rt<<|]);
}
void build(int rt, int l, int r)
{
if (l==r) f[rt].init(read(), qmi(, l-));
else{
int mid = (l+r)>>;
build(rt<<, l, mid);
build(rt<<|, mid+, r);
pushup(rt);
}
}
void modify(int rt, int l, int r, int c, int w)
{
if (l==r) f[rt].init(w, qmi(, l-));
else{
int mid = (l+r)>>;
if (c <= mid) modify(rt<<, l, mid, c, w);
else modify(rt<<|, mid+, r, c, w);
pushup(rt);
}
}
void calc()
{
Matrix ans;
ans.a[][] = , ans.a[][] = , ans.a[][] = ;
ans.a[][] = , ans.a[][] = , ans.a[][] = ;
ans.a[][] = , ans.a[][] = , ans.a[][] = ;
ans = mult(ans, f[]);
printf("%d\n",(ans.a[][]+ans.a[][])%MO);
}
int main()
{
freopen("rseq.in","r",stdin);
freopen("rseq.out","w",stdout);
n = read(), m = read();
build(, , n), calc();
for (int i=; i<=m; i++)
{
int pos = read(), val = read();
modify(, , n, pos, val), calc();
}
return ;
}
【线段树 矩阵乘法dp】8.rseq的更多相关文章
- MAZE(2019年牛客多校第二场E题+线段树+矩阵乘法)
题目链接 传送门 题意 在一张\(n\times m\)的矩阵里面,你每次可以往左右和下三个方向移动(不能回到上一次所在的格子),\(1\)表示这个位置是墙,\(0\)为空地. 现在有\(q\)次操作 ...
- 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...
- hdu 5068(线段树+矩阵乘法)
矩阵乘法来进行所有路径的运算, 线段树来查询修改. 关键还是矩阵乘法的结合律. Harry And Math Teacher Time Limit: 5000/3000 MS (Java/Others ...
- 【对不同形式矩阵的总结】WC 2009 最短路径问题(线段树+矩阵乘法)
题意 题目链接:https://www.luogu.org/problem/P4150 一个 \(6\times n\) 的网格图,每个格点有一个初始权值.有两种操作: 修改一个格子的权值 求 ...
- CF718C Sasha and Array 线段树 + 矩阵乘法
有两个操作: 将 $[l,r]$所有数 + $x$ 求 $\sum_{i=l}^{r}fib(i)$ $n=m=10^5$ 直接求不好求,改成矩阵乘法的形式: $a_{i}=M^x\times ...
- Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 Portal 原题目描述在最下面. 简单的 ...
- LOJ2980 THUSC2017大魔法师(线段树+矩阵乘法)
线段树每个节点维护(A,B,C,len)向量,操作即是将其乘上一个矩阵. #include<iostream> #include<cstdio> #include<cma ...
- HDU 5068 Harry And Math Teacher 线段树+矩阵乘法
题意: 一栋楼有n层,每一层有2个门,每层的两个门和下一层之间的两个门之间各有一条路(共4条). 有两种操作: 0 x y : 输出第x层到第y层的路径数量. 1 x y z : 改变第x层 的 y门 ...
- [tsA1490][2013中国国家集训队第二次作业]osu![概率dp+线段树+矩阵乘法]
这样的题解只能舔题解了,,,qaq 清橙资料里有.. #include <iostream> #include <cstdio> #include <cstdlib> ...
随机推荐
- ahk实现git图床自动预览以及转换markdown格式
ahk实现git图床自动预览以及转换markdown格式 软件地址 https://gitee.com/layty/pic/tree/master/app 软件功能: 检测剪切板,如果剪切板有非文本信 ...
- 修改Ubuntu屏幕的分辨率
最近重新装了一下环境,用vnc连接服务器,发现分辨率过低,于是查了一下如何修改分辨率,将其调高. 编辑/etc/default/grub 搜索"#GRUB_GFXMODE=640x4 ...
- IDEA插件之PMD
1.是什么? PMD 是一个开源静态源代码分析器,它报告在应用程序代码中发现的问题.PMD包含内置规则集,并支持编写自定义规则的功能.PMD不报告编译错误,因为它只能处理格式正确的源文件.PMD报告的 ...
- APM之原理篇
APM,应用性能监控,有new relic等产品,对APM感兴趣的应该不会不知道它了.主要功能就是统计分析应用的CPU.内存.网络.数据库.UI等性能,并提供错误日志捕获.编码人员需要做的仅仅是使用它 ...
- SpingMVC使用小结
- Laravel入门
一.下载Laravel ①github上下载 ②通过composer下载,推荐 第一步,选择你要在哪个目录下载Laravel,打开cmd 第二步,打开https://docs.golaravel.co ...
- python基础知识0-1
绝对值:abs age = -19 age.__abs__() 19 相加: add age.__add__() 与运算:and age.__add__() 比较两个数大小:cmp age._cmp_ ...
- golang随机数及pipe
var pipe1 = make(chan int, 1000) func piTest(){ for{ data := <- pipe1 fmt.Printf("get data:% ...
- Disruptor 并发框架
什么是Disruptor Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平 ...
- CSP-S2019「Symphony」
NOTICE:如觉得本文有什么错误或不妥之处,欢迎评论区以及私信交流,反对乱喷,如有一些让人不爽的评论或人身攻击,带来的后果本人一律不负责 准备工作 Day-inf~Day-3 000 every d ...