每个线段树维护一个行向量[A,B,C,len]分别是这个区间的A,B,C区间和与区间长度,转移显然。

以及此题卡常,稍微哪里写丑了就能100->45。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define ls (x<<1)
#define rs (ls|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,mod=;
int n,T,op,l,r,x,a[N],b[N],c[N]; int rd(){
int x=; char ch=getchar(); bool f=;
while (ch<'' || ch>'') f|=(ch=='-'),ch=getchar();
while (ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f ? -x : x;
} inline void inc(int &x,int y){ x+=y; x-=x>=mod ? mod : ; } struct Mat{
int a[][];
Mat (){ memset(a,,sizeof(a)); }
}I,A[N],v[N<<],tag[N<<]; Mat operator +(const Mat &a,const Mat &b){
Mat c=a;
rep(i,,) inc(c.a[][i],b.a[][i]);
return c;
} void put(int x,const Mat &a){
Mat nw;
rep(i,,) rep(k,,) if (a.a[i][k])
inc(nw.a[][k],1ll*v[x].a[][i]*a.a[i][k]%mod);
v[x]=nw; nw=Mat();
rep(i,,) rep(j,,) if (tag[x].a[i][j]) rep(k,,) if (a.a[j][k])
inc(nw.a[i][k],1ll*tag[x].a[i][j]*a.a[j][k]%mod);
tag[x]=nw;
} void push(int x){ put(ls,tag[x]); put(rs,tag[x]); tag[x]=I; } void build(int x,int L,int R){
tag[x]=I;
if (L==R){ v[x]=A[L]; return; }
int mid=(L+R)>>;
build(lson); build(rson); v[x]=v[ls]+v[rs];
} void mdf(int x,int L,int R,int l,int r,Mat &k){
if (L==l && r==R){ put(x,k); return; }
int mid=(L+R)>>; push(x);
if (r<=mid) mdf(lson,l,r,k);
else if (l>mid) mdf(rson,l,r,k);
else mdf(lson,l,mid,k),mdf(rson,mid+,r,k);
v[x]=v[ls]+v[rs];
} Mat que(int x,int L,int R,int l,int r){
if (L==l && r==R){ return v[x]; }
int mid=(L+R)>>; push(x);
if (r<=mid) return que(lson,l,r);
else if (l>mid) return que(rson,l,r);
else return que(lson,l,mid)+que(rson,mid+,r);
} int main(){
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
n=rd();
rep (i,,) I.a[i][i]=;
rep (i,,n){ A[i].a[][]=; rep (j,,) A[i].a[][j]=rd(); }
build(,,n);
for (T=rd(); T--; ){
op=rd(); l=rd(); r=rd(); Mat s=I;
if (op>= && op<=) x=rd();
if (op==){
Mat res=que(,,n,l,r);
printf("%d %d %d\n",res.a[][],res.a[][],res.a[][]);
continue;
}
if (op==) s.a[][]=;
if (op==) s.a[][]=;
if (op==) s.a[][]=;
if (op==) s.a[][]=x;
if (op==) s.a[][]=x;
if (op==) s.a[][]=,s.a[][]=x;
mdf(,,n,l,r,s);
}
return ;
}

[LOJ#2980][THUSCH2017]大魔法师(线段树+矩阵)的更多相关文章

  1. LOJ 2980 「THUSCH 2017」大魔法师——线段树

    题目:https://loj.ac/problem/2980 线段树维护矩阵. 然后是 30 分.似乎是被卡常了?…… #include<cstdio> #include<cstri ...

  2. 【Loj#535】花火(线段树,扫描线)

    [Loj#535]花火(线段树,扫描线) 题面 Loj 题解 首先如果不考虑交换任意两个数这个操作,答案就是逆序对的个数. 那么暴力就是枚举交换哪个两个数,然后用数据结构之类的东西动态维护逆序对. 但 ...

  3. 【LOJ#6029】市场(线段树)

    [LOJ#6029]市场(线段树) 题面 LOJ 题解 看着就是一个需要势能分析的线段树. 不难发现就是把第二个整除操作化为减法. 考虑一下什么时候整除操作才能变成减法. 假设两个数为\(a,b\). ...

  4. Wannafly Winter Camp 2019.Day 8 div1 E.Souls-like Game(线段树 矩阵快速幂)

    题目链接 \(998244353\)写成\(99824435\)然后调这个线段树模板1.5h= = 以后要注意常量啊啊啊 \(Description\) 每个位置有一个\(3\times3\)的矩阵, ...

  5. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  6. LOJ2980 THUSC2017大魔法师(线段树+矩阵乘法)

    线段树每个节点维护(A,B,C,len)向量,操作即是将其乘上一个矩阵. #include<iostream> #include<cstdio> #include<cma ...

  7. LOJ#3043.【ZJOI2019】 线段树 线段树,概率期望

    原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html 前言 在LOJ交了一下我的代码,发现它比选手机快将近 4 倍. 题解 对于线段树上每一个节 ...

  8. Manthan, Codefest 16 H. Fibonacci-ish II 大力出奇迹 莫队 线段树 矩阵

    H. Fibonacci-ish II 题目连接: http://codeforces.com/contest/633/problem/H Description Yash is finally ti ...

  9. Z0J 3772 Calculate the Function 线段树+矩阵

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5235 这种题目居然没想到,一开始往矩阵快速幂想去了,因为之前跪了太多矩阵快速幂 ...

随机推荐

  1. Hibernate5笔记7--Hibernate缓存机制

    Hibernate缓存机制: 缓存范围: 应用程序中根据缓存的范围,可以将缓存分为三类:   (1)事务范围缓存(单Session,即一级缓存) 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓 ...

  2. RW RO ZI ROM keil中的含义

    编译的一个ARM的程序,会得到这样的信息: ============================================================================== ...

  3. haproxy代理https配置方法【转】

    记得在之前的一篇文章中介绍了nginx反向代理https的方法,今天这里介绍下haproxy代理https的方法: haproxy代理https有两种方式:1)haproxy服务器本身提供ssl证书, ...

  4. Jenkins关联GitHub进行构建

    一.创建一个自由风格的项目 并在高级中勾选你构建完成后保存项目的路径 二.配置你存放代码的GitHub的地址并添加用户名密码 三.立即构建

  5. 【前端开发】禁止微信内置浏览器调整字体大小的方法js

    微信webview内置了调整字体大小的功能,用户可以根据实际情况进行调节.但是很多移动端页面的开发都是使用rem作为单位的,字体大小改变以后,会出现页面布局错乱的情况,因此希望能够禁止微信的字体放大功 ...

  6. python logging 日志

    logging与print 区别,为什么需要logging? 在写脚本的过程中,为了调试程序,我们往往会写很多print打印输出以便用于验证,验证正确后往往会注释掉,一旦验证的地方比较多,再一一注释比 ...

  7. Ninject中如果在抽象类中使用了属性注入,则属性必须设置为protected或public

    Ninject中如果在抽象类中使用了属性注入,则属性必须设置为protected或public 不能使用private,否则无法注入成功,会报null异常

  8. apache camel 条件路由

    <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <route id="e ...

  9. Java学习(set接口、HashSet集合)

    一.set接口 概念:set接口继承自Collection接口,与List接口不同的是,set接口所储存的元素是不重复的. 二.HashSet集合 概念:是set接口的实现类,由哈希表支持(实际上是一 ...

  10. ab性能测试工具

    Apache自带的压力测试工具——ab初体验 http://studiogang.blog.51cto.com/505887/386852 我们知道压力测试的软件确实很多,诸如微软的WAST,惠普的L ...