#线段树,矩阵乘法#洛谷 7453 [THUSCH2017] 大魔法师
分析
首先考虑如果修改操作都是单点修改怎么做,
以第一种修改为例那么就是
\]
同理其它操作也能通过乘矩阵来维护,
考虑区间修改时询问为求和,那么只需要开懒标记即可
时间复杂度 \(O(4^3Q\log_2{n})\)
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=250011,mod=998244353;
typedef long long lll; int n;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
struct maix{
lll p[4][4];
inline maix operator *(const maix &t)const{
rr maix _t;
for (rr int i=0;i<4;++i)
for (rr int j=0;j<4;++j){
_t.p[i][j]=0;
for (rr int k=0;k<4;++k)
_t.p[i][j]+=p[i][k]*t.p[k][j];
_t.p[i][j]%=mod;
}
return _t;
}
}u,lazy[N<<2];
struct Four{
lll p[4];
inline Four operator +(const Four &t)const{
rr Four _t;
for (rr int i=0;i<4;++i)
_t.p[i]=p[i]+t.p[i]>=mod?p[i]+t.p[i]-mod:p[i]+t.p[i];
return _t;
}
}ANS,w[N<<2];
inline bool Is_Unit(maix A){
for (rr int i=0;i<4;++i)
for (rr int j=0;j<4;++j)
if (A.p[i][j]!=u.p[i][j]) return 0;
return 1;
}
inline Four mul(Four A,maix B){
rr Four C;
for (rr int i=0;i<4;++i){
C.p[i]=0;
for (rr int j=0;j<4;++j)
C.p[i]+=A.p[j]*B.p[j][i];
C.p[i]%=mod;
}
return C;
}
inline void pdown(int k){
w[k<<1]=mul(w[k<<1],lazy[k]);
lazy[k<<1]=lazy[k<<1]*lazy[k];
w[k<<1|1]=mul(w[k<<1|1],lazy[k]);
lazy[k<<1|1]=lazy[k<<1|1]*lazy[k];
lazy[k]=u;
}
inline void build(int k,int l,int r){
lazy[k]=u;
if (l==r){
for (rr int i=0;i<3;++i)
w[k].p[i]=iut();
w[k].p[3]=1;
return;
}
rr int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
w[k]=w[k<<1]+w[k<<1|1];
}
inline void update(int k,int l,int r,int x,int y,maix z){
if (l==x&&r==y) {w[k]=mul(w[k],z),lazy[k]=lazy[k]*z; return;}
rr int mid=(l+r)>>1; if (!Is_Unit(lazy[k])) pdown(k);
if (y<=mid) update(k<<1,l,mid,x,y,z);
else if (x>mid) update(k<<1|1,mid+1,r,x,y,z);
else update(k<<1,l,mid,x,mid,z),update(k<<1|1,mid+1,r,mid+1,y,z);
w[k]=w[k<<1]+w[k<<1|1];
}
inline Four query(int k,int l,int r,int x,int y){
if (l==x&&r==y) return w[k];
rr int mid=(l+r)>>1; if (!Is_Unit(lazy[k])) pdown(k);
if (y<=mid) return query(k<<1,l,mid,x,y);
else if (x>mid) return query(k<<1|1,mid+1,r,x,y);
else return query(k<<1,l,mid,x,mid)+query(k<<1|1,mid+1,r,mid+1,y);
}
signed main(){
for (rr int i=0;i<4;++i) u.p[i][i]=1;
n=iut(),build(1,1,n);
for (rr int Q=iut();Q;--Q){
rr int opt=iut(),l=iut(),r=iut(),w=0; rr maix z=u;
if (opt<7){
if (opt>3) w=iut();
switch (opt){
case 1:{
z.p[1][0]=1;
break;
}
case 2:{
z.p[2][1]=1;
break;
}
case 3:{
z.p[0][2]=1;
break;
}
case 4:{
z.p[3][0]=w;
break;
}
case 5:{
z.p[1][1]=w;
break;
}
case 6:{
z.p[2][2]=0,z.p[3][2]=w;
break;
}
}
update(1,1,n,l,r,z);
}
else{
ANS=query(1,1,n,l,r);
for (rr int i=0;i<3;++i)
print(ANS.p[i]),putchar(i==2?10:32);
}
}
return 0;
}
#线段树,矩阵乘法#洛谷 7453 [THUSCH2017] 大魔法师的更多相关文章
- 【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\) 的网格图,每个格点有一个初始权值.有两种操作: 修改一个格子的权值 求 ...
- MAZE(2019年牛客多校第二场E题+线段树+矩阵乘法)
题目链接 传送门 题意 在一张\(n\times m\)的矩阵里面,你每次可以往左右和下三个方向移动(不能回到上一次所在的格子),\(1\)表示这个位置是墙,\(0\)为空地. 现在有\(q\)次操作 ...
- 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> ...
- SP1716 GSS3(线段树+矩阵乘法)
Code: #include <bits/stdc++.h> #define N 50001 #define ll long long #define lson now<<1 ...
随机推荐
- 服务端高性能网络IO编程模型简析
服务端高性能网络IO编程模型简析 一.客户端与服务器端 多数网络应用可以分为客户端(client)和服务器端(server)模型,然后中间通过各种定义的协议来进行两端的通信. 比如常用的 Nginx ...
- 【Android 逆向】【攻防世界】easyjava
1. apk 安装到手机,提示输入flag 2. jadx 打开apk看看 private static char a(String str, b bVar, a aVar) { return aVa ...
- xml开发笔记(一):tinyXml2库介绍、编译和工程模板
前言 Qt开发Xml相关技术,使用到tinyxml2库. TinyXML TinyXML是一个简单的.小的C++的XML解析器,可以集成到其他程序中.它是ROS的标准XML解析器. 最新 ...
- 问题:RuntimeError: Model class LuffyAPI.apps.user.models.UserInfo doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
问题截图 报错原因 提示app未注册,但实际上已经注册的 1. # settings配置文件移动后要将这个settings添加到环境变量中 sys.path.insert(0, BASE_DIR) # ...
- Centos下git pull免密码操作
在终端输入以下指令: git config --global credential.helper store然后再次执行pull操作,还是会提示一次输入帐号与密码.断开终端链接,重连,再次进行pull ...
- 【Azure 应用服务】Web.config中设置域名访问限制,IP地址限制访问特定的页面资源 (Rewrite)
问题描述 问题一:web app已经绑定了域名,例如是www.a.com,现在只允许使用www.a.com 访问,如果使用默认的域名xxxx.chinacloundsites.cn访问的时候,需要显示 ...
- Redis集群Cluster
Redis Cluster 是社区版推出的 Redis 分布式集群解决方案,主要解决 Redis 分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好 ...
- Mysql使用limit深度分页优化
1.背景: mysql使用select * limit offset, rows分页在深度分页的情况下.性能急剧下降. 例如:select * 的情况下直接⽤limit 600000,10 扫描的是约 ...
- Jpackage-制作无需预装Java环境的Jar可执行程序
JAR 包要在预装 JRE 环境的系统上执行.如果没有预先安装 JRE 环境,又想直接运行 Java 程序,该怎么办呢? 这篇文章我们会先学习如何将 Java 程序打包成一个可执行的 Java JAR ...
- Python面向对象之多态和鸭子类型
[一]多态 [1]什么是多态 多态指的是一类事物有多种形态 [2]示例 比如动物有多种形态:猫.狗.猪 import abc class Animal(metaclass=abc.ABCMeta): ...