线段树每个节点维护(A,B,C,len)向量,操作即是将其乘上一个矩阵。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 250010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,m;
struct matrix
{int n,a[4][4];matrix operator *(const matrix&b) const{matrix c;c.n=n;memset(c.a,0,sizeof(c.a));for (int i=0;i<n;i++)for (int k=0;k<4;k++)for (int j=0;j<4;j++)c.a[i][j]=(c.a[i][j]+1ll*a[i][k]*b.a[k][j])%P;return c;}matrix operator +(const matrix&b) const{matrix c;c.n=n;memset(c.a,0,sizeof(c.a));for (int i=0;i<n;i++)for (int j=0;j<4;j++)c.a[i][j]=(a[i][j]+b.a[i][j])%P;return c;}void print(){cout<<n<<endl;for (int i=0;i<n;i++){    for (int j=0;j<4;j++)cout<<a[i][j]<<' ';cout<<endl;}}
};
int L[N<<2],R[N<<2],a[N],b[N],c[N];
bool islazy[N<<2];
matrix tree[N<<2],lazy[N<<2],f,I;
void up(int k){tree[k]=tree[k<<1]+tree[k<<1|1];}
void build(int k,int l,int r)
{L[k]=l,R[k]=r;lazy[k]=I;if (l==r) {tree[k].n=1,tree[k].a[0][0]=a[l],tree[k].a[0][1]=b[l],tree[k].a[0][2]=c[l],tree[k].a[0][3]=1;return;}int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);up(k);
}
void update(int k,matrix x)
{tree[k]=tree[k]*x;lazy[k]=lazy[k]*x;islazy[k]=1;
}
void down(int k)
{update(k<<1,lazy[k]);update(k<<1|1,lazy[k]);lazy[k]=I;islazy[k]=0;
}
void modify(int k,int l,int r,matrix x)
{if (L[k]==l&&R[k]==r) {update(k,x);return;}if (islazy[k]) down(k);int mid=L[k]+R[k]>>1;if (r<=mid) modify(k<<1,l,r,x);else if (l>mid) modify(k<<1|1,l,r,x);else modify(k<<1,l,mid,x),modify(k<<1|1,mid+1,r,x);up(k);
}
matrix query(int k,int l,int r)
{if (L[k]==l&&R[k]==r) return tree[k];if (islazy[k]) down(k);int mid=L[k]+R[k]>>1;if (r<=mid) return query(k<<1,l,r);else if (l>mid) return query(k<<1|1,l,r);else return query(k<<1,l,mid)+query(k<<1|1,mid+1,r);
}
signed main()
{
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();for (int i=1;i<=n;i++) a[i]=read(),b[i]=read(),c[i]=read();I.n=4;for (int i=0;i<4;i++) I.a[i][i]=1;build(1,1,n);f.n=4;m=read();for (int i=1;i<=m;i++){int op=read(),l=read(),r=read();memset(f.a,0,sizeof(f.a));if (op==1) f.a[0][0]=f.a[1][1]=f.a[2][2]=f.a[3][3]=f.a[1][0]=1;if (op==2) f.a[0][0]=f.a[1][1]=f.a[2][2]=f.a[3][3]=f.a[2][1]=1;if (op==3) f.a[0][0]=f.a[1][1]=f.a[2][2]=f.a[3][3]=f.a[0][2]=1;if (op==4) f.a[0][0]=f.a[1][1]=f.a[2][2]=f.a[3][3]=1,f.a[3][0]=read();if (op==5) f.a[0][0]=f.a[2][2]=f.a[3][3]=1,f.a[1][1]=read();if (op==6) f.a[0][0]=f.a[1][1]=f.a[3][3]=1,f.a[3][2]=read();if (op!=7) modify(1,l,r,f);else{matrix ans=query(1,l,r);printf("%d %d %d\n",ans.a[0][0],ans.a[0][1],ans.a[0][2]);}}return 0;//NOTICE LONG LONG!!!!!
}

  

转载于:https://www.cnblogs.com/Gloid/p/10636392.html

LOJ2980 THUSC2017大魔法师(线段树+矩阵乘法)相关推荐

  1. jzoj6293-迷宫【ddp,线段树,矩阵乘法】

    正题 题目大意 一个n∗mn*mn∗m的迷宫,不能往左走,有墙,每次修改一个点或询问两个点之间的最短距离. 解题思路 考虑到nnn的值很小,所以我们可以用矩阵转移,然后要求支持修改和查询所以我们考虑d ...

  2. 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)

    题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...

  3. 线段树 + 矩阵 --- ZOJ 3772 Calculate the Function

    Calculate the Function Problem's Link:   http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCod ...

  4. luogu P5142 区间方差(线段树、乘法逆元)

    luogu P5142 区间方差 本题要求维护模区间方差,很明显是一道数据结构题. 我们化简方差公式: 而平均数等于 可以发现,我们只需要维护序列的区间和和区间平方和,就可以维护平均数和方差. 区间和 ...

  5. New Year and Old Subsequence CodeForces - 750E(线段树+矩阵dp)2019南昌icpc网络赛Hello 2019

    A string t is called nice if a string "2017" occurs in t as a subsequence but a string &qu ...

  6. 2018.10.09 ZYH的斐波那契数列(线段树+矩阵快速幂)

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

  7. NOIP模拟题 [线段树][矩阵快速幂]

    有一定难度,要深入挖掘问题特性. T1: 题意: 给定一个序列,每次操作把操作位置及其后面比它小的数按顺序排列(整体上仍在原来的位置),求每次操作后的逆序对数. 分析: 每个数对逆序对数都有一个贡献( ...

  8. 河南省多校联盟二-F 线段树+矩阵

    ---恢复内容开始--- 1284: SP教数学 时间限制: 2 秒  内存限制: 128 MB 提交: 24  解决: 4 题目描述 输入 输出 对于每组数据的2操作,输出一行对1e9 + 7取模的 ...

  9. 大数据Mapreduce编程——矩阵乘法

    编程要求 完成矩阵乘法的 Map 函数和 Reduce 函数 1.设计两个矩阵(3050,50100),在每个单元格中填入一个 0-99 的随机数,并写入 两个文件中,作为 Map 函数的输入 2.测 ...

最新文章

  1. 非官方影印版存在的问题
  2. BugkuCTF-MISC题乌云邀请码
  3. ReplicaManager分析
  4. 计算机应用考试上机试,电大计算机应用考试机试实操ABCD.docx
  5. Lua实现二进制串与Hex显示串的相互转换
  6. 支付签约_已成燎原之势!蜻蜓支付出库、签约、地推火爆!
  7. hive中创建表失败
  8. 区块链项目开发最容易受区块链技术影响的行业
  9. 阿里云地域和可用区怎么选?
  10. 打印101~200之间的素数
  11. 逆战ds服务器怎么修复,IBMDS3512存储硬盘坏了正确的更换方法应该是怎么
  12. Python 列表转为字典
  13. 移动 PC 的数据加密工具包 - 安全分析
  14. 谷粒商城-基础篇-商品服务2-品牌管理(P59-P69)+(P75)
  15. 昭通计算机一级b考试试题及答案,2022云南昭通事业单位考试综合应用能力(B类)考试如何备考?...
  16. 将网页保存为mht文件
  17. Navicat导出ncx文件并解密连接密码
  18. 现在的AI专业(如机器学习)已经沦为调包专业了吗?
  19. vb.net程序可以在触摸屏上运行么_触摸屏amp;触控一体机常见故障解决方法
  20. python怎么在图片上写字的软件_python 实现PIL模块在图片画线写字

热门文章

  1. 简述html的3种列表uloldl,语义化HTML:ul、ol和dl
  2. oracle 造数据脚本_Oracle数据库shell脚本--统计所有数据库用户信息及明细
  3. java 隐藏了什么_JAVA程序中封装与隐藏是什么意思
  4. 基于C++实现五子棋AI算法思想
  5. jq 控制td只显示一行_CSS让表格里的内容强制显示一行,超出长度显示省略号
  6. google账号解除游戏绑定_附方法!关于物联卡手机号的绑定与解绑
  7. 都兰县第一中学计算机,都兰县第一中学教案.doc
  8. java 方式配置ssm,关于SSM以及Spring boot中对于Spring MVC配置的问题
  9. 国内外知名光端机品牌大全
  10. 【渝粤教育】电大中专药事管理与法规作业 题库