题目链接

感觉本题没有太多思维难度,纯DS


大致思路把每个位置的三个属性看做一个 1 × 4 1\times 4 1×4 的矩阵(第四个位置维护常数项),并用线段树维护区间矩阵和
同时,我们计算出六种修改操作的转移矩阵,修改时直接将原矩阵乘上转移矩阵。由于矩阵满足结合律与分配率,所以可以将单点修改扩展为区间修改。

下面是分别六种操作的转移矩阵

  1. [ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} 1 \space 0 \space 0 \space 0 \\ 1 \space 1 \space 0 \space 0 \\ 0 \space 0 \space 1 \space 0 \\ 0 \space 0 \space 0 \space 1 \end{bmatrix} ⎣⎢⎢⎡​1 0 0 01 1 0 00 0 1 00 0 0 1​⎦⎥⎥⎤​
  2. [ 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 ] \begin{bmatrix} 1 \space 0 \space 0 \space 0 \\ 0 \space 1 \space 0 \space 0 \\ 0 \space 1 \space 1 \space 0 \\ 0 \space 0 \space 0 \space 1 \end{bmatrix} ⎣⎢⎢⎡​1 0 0 00 1 0 00 1 1 00 0 0 1​⎦⎥⎥⎤​
  3. [ 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} 1 \space 0 \space 1 \space 0 \\ 0 \space 1 \space 0 \space 0 \\ 0 \space 0 \space 1 \space 0 \\ 0 \space 0 \space 0 \space 1 \end{bmatrix} ⎣⎢⎢⎡​1 0 1 00 1 0 00 0 1 00 0 0 1​⎦⎥⎥⎤​
  4. [ 1 0 0 0 0 1 0 0 0 0 1 0 v 0 0 1 ] \begin{bmatrix} 1 \space 0 \space 0 \space 0 \\ 0 \space 1 \space 0 \space 0 \\ 0 \space 0 \space 1 \space 0 \\ v \space 0 \space 0 \space 1 \end{bmatrix} ⎣⎢⎢⎡​1 0 0 00 1 0 00 0 1 0v 0 0 1​⎦⎥⎥⎤​
  5. [ 1 0 0 0 0 v 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} 1 \space 0 \space 0 \space 0 \\ 0 \space v \space 0 \space 0 \\ 0 \space 0 \space 1 \space 0 \\ 0 \space 0 \space 0 \space 1 \end{bmatrix} ⎣⎢⎢⎡​1 0 0 00 v 0 00 0 1 00 0 0 1​⎦⎥⎥⎤​
  6. [ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 v 1 ] \begin{bmatrix} 1 \space 0 \space 0 \space 0 \\ 0 \space 1 \space 0 \space 0 \\ 0 \space 0 \space 0 \space 0 \\ 0 \space 0 \space v \space 1 \end{bmatrix} ⎣⎢⎢⎡​1 0 0 00 1 0 00 0 0 00 0 v 1​⎦⎥⎥⎤​
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#pragma GCC optimize(2)
const int Maxn=2.5e5+10;
const int Maxm=Maxn<<2;
const int mod=998244353;
const int m=4;
struct mat{int d[6][6];bool operator ==(const mat &x)const{for(int i=1;i<=m;++i)for(int j=1;j<=m;++j)if(x.d[i][j]!=d[i][j])return 0;return 1;}
}f[Maxm],I;
struct ary{int d[6];bool operator ==(const ary &x)const{for(int i=1;i<=m;++i)if(x.d[i]!=d[i])return 0;return 1;}
}c[Maxm],a[Maxn];
int n,q;
inline int add_mod(int x,int y)
{int tmp=(x+y);if(tmp>=mod)tmp-=mod;return tmp;
}
inline int mul_mod(int x,int y)
{return (1ll*x*y)%mod;
}
inline void check_add(int &x,int y)
{x=add_mod(x,y);
}
inline void check_mul(int &x,int y)
{x=mul_mod(x,y);
}
mat mul(mat a,mat b)
{mat c;memset(c.d,0,sizeof(c.d));for(int i=1;i<=m;++i)for(int j=1;j<=m;++j)for(int k=1;k<=m;++k)check_add(c.d[i][j],mul_mod(a.d[i][k],b.d[k][j]));return c;
}
ary add(ary a,ary b)
{ary c;for(int i=1;i<=m;++i)c.d[i]=add_mod(a.d[i],b.d[i]);return c;
}
inline int read()
{int s=0,w=1;char ch=getchar();while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();return s*w;
}
inline void push_up(int k)
{c[k]=add(c[k<<1],c[k<<1|1]);
}
inline void upd(int k,mat v)
{f[k]=mul(f[k],v);ary t;memset(t.d,0,sizeof(t.d));for(int i=1;i<=m;++i)for(int j=1;j<=m;++j)check_add(t.d[i],mul_mod(c[k].d[j],v.d[j][i]));c[k]=t;
}
inline void push_down(int k)
{if(f[k]==I)return;upd(k<<1,f[k]);upd(k<<1|1,f[k]);f[k]=I;
}
void modify(int k,int l,int r,int x,int y,mat v)
{if(x<=l && r<=y)return upd(k,v);push_down(k);int mid=(l+r)>>1;if(x<=mid)modify(k<<1,l,mid,x,y,v);if(mid<y)modify(k<<1|1,mid+1,r,x,y,v);push_up(k);
}
ary query(int k,int l,int r,int x,int y)
{if(x<=l && r<=y)return c[k];push_down(k);int mid=(l+r)>>1;ary ret;memset(ret.d,0,sizeof(ret.d));if(x<=mid)ret=query(k<<1,l,mid,x,y);if(mid<y)ret=add(ret,query(k<<1|1,mid+1,r,x,y));return ret;
}
void build(int k,int l,int r)
{f[k]=I;// if(l==r)// {//    c[k]=a[l];//   printf("k = %d\n",k);//  for(int i=1;i<=m;++i)//  printf("%d ",c[k].d[i]);//    putchar('\n');// }if(l==r){c[k]=a[l];return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);push_up(k);// printf("k = %d\n",k);// for(int i=1;i<=m;++i)// printf("%d ",c[k].d[i]);// putchar('\n');
}
int main()
{freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);n=read();memset(I.d,0,sizeof(I.d));for(int i=1;i<=m;++i)I.d[i][i]=1;for(int i=1;i<=n;++i){a[i].d[1]=read();a[i].d[2]=read();a[i].d[3]=read();a[i].d[4]=1;}build(1,1,n);q=read();while(q--){int opt=read(),l=read(),r=read();if(opt==7){ary tmp=query(1,1,n,l,r);for(int i=1;i<m;++i)printf("%d ",tmp.d[i]);putchar('\n');continue;}mat t=I;if(opt==1)t.d[2][1]=1;if(opt==2)t.d[3][2]=1;if(opt==3)t.d[1][3]=1;if(opt==4)t.d[4][1]=read();if(opt==5)t.d[2][2]=read();if(opt==6){t.d[3][3]=0;t.d[4][3]=read();}modify(1,1,n,l,r,t);}return 0;
}

P7453 [THUSCH2017] 大魔法师 题解相关推荐

  1. 洛谷 P7453 [THUSCH2017] 大魔法师

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P7453 [THUSCH2017] 大魔法师 题目 题目描述 大魔法师小 L 制作了 n n n 个魔力水晶球,每个水晶球有水.火. ...

  2. 【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列

    文章目录 T1:单峰排列 题目 题解 code T2:历史研究 题目 题解 code T3:大魔法师 题目 题解 code 我可能这辈子都更不出来狂欢赛5了,先咕咕 T1:单峰排列 题目 一个n的全排 ...

  3. 牛客题霸 [寻找第K大] C++题解/答案

    牛客题霸 [寻找第K大] C++题解/答案 题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的 ...

  4. 游戏王-黑暗大魔法师发动教程

    游戏王-决斗链接 游戏王-混沌力量-城之内 今天还剩下100点血,我集合了 5个尸块,准备发动黑暗大魔法师效果. 来吧!!!受死吧!!! 一定是姿势不对,再重新摆一下 对面看不下去了,说我 " ...

  5. matlab大地主题正算代码,大地主题解算正算

    其关键问题是找出椭球 面上的大地元素与球面上相应元素之间的关系式,同时解决在球面上进行大地主题解算的方 法. 正算流程: 1.计算起点的归化纬度 2.计算辅助...... 其关键问题是找出椭球 面上的 ...

  6. 【测绘程序设计】——大地主题解算

      大地主题解算--大地极坐标(S,A)与大地坐标(B,L)的相互换算,它包括①大地主题正算 ( B 1 , L 1 ) + S + A 12 → ( B 2 , L 2 ) + A

  7. HDU 1253 胜利大逃亡 题解

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  8. BZOJ4573:[ZJOI2016]大森林——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4573 https://www.luogu.org/problemnew/show/P3348#sub ...

  9. 2017.10.25水题大作战题解

    rank: T1P1615 西游记公司 https://www.luogu.org/problemnew/show/P1615 scanf直接秒 1 #include<iostream> ...

最新文章

  1. 检查超时-Ajax之四
  2. C语言初学者代码中的常见错误与瑕疵(2)
  3. OpenCV——释放时错误[SourceReaderCB::~SourceReaderCB terminating async callback]解决方案
  4. 2018中国C++大会精彩回顾
  5. Oppoa7手机怎么录视频 oppo手机屏幕录制
  6. mysql计划任务书_求做一个基于java的mysql课程设计任务书 要求如下
  7. 【Python】字典类型
  8. Web Worker
  9. rust货轮什么时候出现_婴儿什么时候用枕头合适?并非三个月,出现以下征兆再用不迟...
  10. python编程可以自学么-风变编程的Python这么火,零基础可以自学吗?
  11. Arduino的软件:Arduino IDE和Mind+图形化编程
  12. HDMI-FMC子卡的使用(基于VC707)(中)
  13. 计算机相关的外文参考文献,计算机英文参考文献
  14. 由浅入深学习android input系统(五) - input系统的启动
  15. 宁皓网ninghao.net这个人的教程不错
  16. 固态加装机械计算机不显示,win10不显示机械硬盘怎么办_win10加装机械硬盘不显示的解决方法...
  17. 域权限维持——黄金票据和白金票据
  18. 用python实现时间序列白噪声检验
  19. 用户商家对刷脸支付好评不断普及指日可待
  20. H5智能内核-基于MVC架构的全新Zoomla!逐浪CMS2 x3.8发布

热门文章

  1. oracle sql获取年月日时分秒,Oracle SQL日期及日期格式获取命令
  2. 【云原生之Docker实战】使用Docker部署Rap2开源接口管理工具
  3. Jave概述及变量总结
  4. 2019年美赛C题画图,python函数库basemap下载
  5. java 在方法中抛出异常_Java异常的抛出
  6. 陶渊明《敕勒川》“无我之境”完美体现!
  7. iif函数 vfp_VFP常用函数大全
  8. python3 中英文标点转换
  9. 基于核极限学习机KELM、在线顺序极限学习机OS-ELM、在线贯序核极限学习机OSKELM
  10. 手游侠岚服务端+客户端源码+资源说明+启动脚本