每个线段树维护一个行向量[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. 快速修改Matlab默认启动路径(Windows/Mac)

    如何修改Matlab启动路径/Windows or Mac 控制台内输入一下两行命令,之后重启MATLAB即可   newpath = '你所要设定的路径'; userpath(newpath)   ...

  2. 关于Java的“找不到或无法加载主类”

    Java编程思想4th第六章的关于访问权限和包的笔记总结时遇到了一个关于package命名及导入的问题. 环境:Ubuntu 16.04.3 LTS x86_64 首先,我要安装部署Java的开发环境 ...

  3. Dream------scala--函数定义、流程控制、异常处理

    Dream------scala--函数定义.流程控制.异常处理 一.函数的定义 1.新建工程

  4. Django 1.10中文文档-模型参考

    模型字段 本文档包含了Django提供的全部模型 Field 包括 字段选项 和 字段类型 的API参考. 参见 如果内建的字段不能满足你的需求, 你可以蚕食 django-localflavor ( ...

  5. go 数组

    数组的定义和 初始化 数组是同一类型的元素集合 ]int //定义⼀个数组 Go中数组下标从0开始,因此长度为n的数组下标范围:[0,n-1] 整数数组中的元素默认初始化为0,字符串数组中的元素默认初 ...

  6. 芒果TV 视频真实的地址获取

    # coding=utf-8 import requests import json import re import os import urlparse import random vid = r ...

  7. Java集合之Collection与之子类回顾

    Java学习这么久,打算这几天回顾下java的基本知识点,首先是集合. 一.常用集合类关系图 Collection |___List 有序,可重复 |___ArrayList  底层数据结构是数组,增 ...

  8. cobbler 无人值守系统安装

    概述 本文适合centos6 | centos7 系统的安装 执行操作之前:检查系统防火墙,selinux是否关闭,网络链接是否畅通. Cobbler是一个免费开源系统安装部署软件,用于自动化网络安装 ...

  9. Qt软件打包发布(QT5.4.1(msvc2013_64_opengl),Win7 64bit)

    环境:QT5.4.1(msvc2013_64_opengl),Win7 64bit 编译方式 Qt开发的程序发布的时候经常采用两种方式:1)静态编译,可生成单一的可执行文件:2)动态编译,需同时附上需 ...

  10. MAVLink v1.0详解——结构

    本文针对 MAVLink v1.0版本,协议版本:3. MAVLink是为微型飞行器MAV(Micro Air Vehicle)设计的(LGPL)开源的通讯协议.是无人飞行器和地面站(Ground C ...