【线段树 矩阵乘法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> ...
随机推荐
- 洛谷 题解 P1353 【[USACO08JAN]跑步Running】
动态规划 状态 dp[i][j]表示第i分钟疲劳值为j的最大值 初始 全部都为一个最小值"0" 转移 考虑休息和走 如果当前疲劳值比时间要大,显然不可能出现这种情况 如果比时间小 ...
- [转帖]System Dynamic Management Views
System Dynamic Management Views https://docs.microsoft.com/en-us/sql/relational-databases/system-dyn ...
- go 二进制数据处理
以下是利用标准库binary来进行编解码 编码 ①使用bytes.Buffer来存储编码生成的串②使用binary.Write来编码存储在①的buf中 package main import ( &q ...
- Python 解leetcode:3. Longest Substring Without Repeating Characters
题目描述:求一个字符串的不含重复字符的最长连续子串的长度: 思路: 使用一个哈希表保存字符出现的位置: 使用left和right分别表示子串的最左和最右字符的下标: 遍历字符串,如果当前字符在哈希表中 ...
- redis集群(多机)分布
一.实现原理 一致性哈希算法(Consistent Hashing): http://www.zsythink.net/archives/1182 二.配置两个redis服务,端口号要不一致 三.代码 ...
- Python基础 第三章 使用字符串(3)字符串方法&本章小结
字符串的方法非常之多,重点学习一些最有用的,完整的字符串方法参见<Python基础教程(第三版)>附录B. 模块string,虽然风头已小,但其包含了一些字符串方法中没有的常量和函数,故将 ...
- 【AC自动机】最短母串
[题目链接] https://loj.ac/problem/10061 [题意] 给定 n 个字符串 S1-Sn,要求找到一个最短的字符串 T,使得这 n 个字符串都是 T 的子串. [题解] 类似于 ...
- Java 字符串比较
1.字符串比较 compareTo() 方法用于两种方式的比较: 字符串与对象进行比较. 按字典顺序比较两个字符串. 返回值 返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符 ...
- Go入门所踩过的坑:cannot find package "" in any of
问题:cannot find package "" in any of.现已按照博客解决,分享一种自己踩得坑欢迎大神指导交流! 首先使用go env查看当前环境变量,新手入门出现找 ...
- 轻松搭建CAS 5.x系列(2)-搭建HTTPS的SSO SERVER端
概要说明 CAS要求,必须使用HTTPS的服务,否则就只等实现登录,无法实现单点登录.科普下HTTPS,网站有HTTP和HTTPS两种协议.HTTP是浏览器到网站之间是明文传输,比如你输入帐号名和密码 ...