一个序列,每个物品有三个权值 $A,B,C$

要求维护:

1.区间 $A_i+=B_i$

2.区间 $B_i+=C_i$

3.区间 $C_i+=A_i$

4.区间 $A_i+=v$

5.区间 $B_i \times = v$

6.区间 $C_i = v$

7.询问区间 $A,B,C$ 各自的和

线段树,每个点维护 $A,B,C,区间长度$

每次修改相当于区间乘一个转移矩阵

时间复杂度 $O(16nlogn)$

垫底

#include <bits/stdc++.h>
#define LL long long
using namespace std;
#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
inline int read() {
int x = , f = ; char ch = getchar();
for (; !isdigit(ch); ch = getchar())if (ch == '-')f = -f;
for (; isdigit(ch); ch = getchar()) x = * x + ch - '';
return x * f;
}
const int mod = , maxn = 2.5e5 + ;
#define ls (x << 1)
#define rs ((x << 1) | 1)
int n, q, A[maxn], B[maxn], C[maxn];
struct Matrix {
int a[][];
Matrix() {memset(a, , sizeof(a));}
Matrix operator * (const Matrix &b) const {
Matrix c;
rep(i, , ) rep(j, , ) rep(k, , )
(c.a[i][j] += (1LL * a[i][k] * b.a[k][j] % mod)) %= mod;
return c;
}
Matrix operator + (const Matrix &b) const {
Matrix c;
rep(i, , ) rep(j, , ) c.a[i][j] = (a[i][j] + b.a[i][j]) % mod;
return c;
}
}tag[maxn << ];
int seg[maxn << ][];
void mul(int *f, Matrix gg) {
int tmp[] = {, , , };
rep(i, , ) rep(j, , ) (tmp[j] += (1LL * f[i] * gg.a[i][j] % mod)) %= mod;
rep(i, , ) f[i] = tmp[i];
}
inline int clear(Matrix x) {
if (!(x.a[][] == && x.a[][] == && x.a[][] == && x.a[][] == ))return false;
if (x.a[][] || x.a[][] || x.a[][] || x.a[][] || x.a[][] || x.a[][])return false;
if (x.a[][] || x.a[][] || x.a[][] || x.a[][] || x.a[][] || x.a[][]) return false;
return true;
}
inline void pushup(int x) {
rep(i, , ) seg[x][i] = (seg[ls][i] + seg[rs][i]) % mod;
}
inline void pushdown(int x) {
if(clear(tag[x])) return;
tag[ls] = tag[ls] * tag[x], tag[rs] = tag[rs] * tag[x];
mul(seg[ls], tag[x]), mul(seg[rs], tag[x]);
rep(i, , ) rep(j, , ) tag[x].a[i][j] = (i == j);
}
inline void build(int x, int l, int r) {
if(l == r) {
seg[x][] = A[l]; seg[x][] = B[l]; seg[x][] = C[l]; seg[x][] = ;
return;
}
int mid = (l + r) >> ;
build(ls, l, mid); build(rs, mid + , r);
pushup(x);
}
Matrix cur; int res[];
inline void update(int x, int l, int r, int L, int R) {
if(L <= l && r <= R) {
mul(seg[x], cur);
tag[x] = tag[x] * cur;
return;
}
pushdown(x);
int mid = (l + r) >> ;
if(L <= mid) update(ls, l, mid, L, R);
if(R > mid) update(rs, mid + , r, L, R);
pushup(x);
}
inline void query(int x, int l, int r, int L, int R) {
if(L <= l && r <= R) {
rep(i, , ) (res[i] += seg[x][i]) %= mod;
return;
}
pushdown(x);
int mid = (l + r) >> ;
if(L <= mid) query(ls, l, mid, L, R);
if(R > mid) query(rs, mid + , r, L, R);
}
int main() {
n = read();
rep(i, , (n<<)) rep(j, , ) rep(k, , ) tag[i].a[j][k] = (j == k);
rep(i, , n) A[i] = read(), B[i] = read(), C[i] = read();
build(, , n);
q = read();
while(q--) {
int opt = read(), l = read(), r = read();
rep(i, , ) rep(j, , ) cur.a[i][j] = (i == j);
if(opt == ) cur.a[][]++;
else if(opt == ) cur.a[][]++;
else if(opt == ) cur.a[][]++;
else if(opt == ) (cur.a[][] += read()) %= mod;
else if(opt == ) cur.a[][] = read();
else if(opt == ) cur.a[][] = , cur.a[][] = read();
if(opt != ) update(, , n, l, r);
if(opt == ) {
rep(i, , ) res[i] = ;
query(, , n, l, r);
printf("%d %d %d\n", res[], res[], res[]);
continue;
}
}
}

THUSC 2017 大魔法师的更多相关文章

  1. THUSCH 2017 大魔法师(矩阵乘法+线段树)

    题意 https://loj.ac/problem/2980 思路 区间修改考虑用线段树维护.由于一段区间的 \(A,B,C\) 可以表示成由原来的 \(A,B,C\) 乘上带上系数再加上某一个某个常 ...

  2. 「THUSCH 2017」大魔法师 解题报告

    「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...

  3. 「THUSCH 2017」大魔法师

    Description 大魔法师小 L 制作了 \(n\) 个魔力水晶球,每个水晶球有水.火.土三个属性的能量值.小 L 把这 \(n\) 个水晶球在地上从前向后排成一行,然后开始今天的魔法表演. 我 ...

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

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

  5. THUSC 2017 游记

    Day0 早上在家里整理东西. 下午坐飞机去北京.(怎么又去北京,上周刚去的北京) 一开始飞机爬升的时候太无聊就睡着了.醒了以后就开始吃东西.吐槽一句:厦航的飞机就是好啊.上面的点心也比上次海航的好吃 ...

  6. THUSC 2017 D1T2 杜老师

    这是个非常有趣的数学题啦... 其实大概推一推式子就能得到一个信息,就是答案一定是$2$的整数次幂,并且其实答案就是$2^{R-L+1-sum}$,其中$sum$表示有多少个数不能用$L-i-1$的数 ...

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

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

  8. [LOJ#2980][THUSCH2017]大魔法师(线段树+矩阵)

    每个线段树维护一个行向量[A,B,C,len]分别是这个区间的A,B,C区间和与区间长度,转移显然. 以及此题卡常,稍微哪里写丑了就能100->45. #include<cstdio> ...

  9. [THUSC2017]大魔法师:线段树

    分析 在线段树上用\(4 \times 4\)的矩阵打标记. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register int ...

随机推荐

  1. python默认参数不能定义为可变对象类型

    python的默认参数只会在函数定义时被确定,而不是每次调用时重新确定,所以,一旦在函数中修改了默认参数,则在随后的调用中都会生效 由于这个特性,在定义函数时,如果默认参数使用可变的对象类型,如空列表 ...

  2. This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in问题

    点击 Help > Install New Software. 在 Work with 的输入区域里, 输入: https://dl-ssl.google.com/android/eclipse ...

  3. Loadrunder之脚本篇——参数化取值策略

    参数取值选项 Select next row Update value on 以上两个选项是改变参数化取值的关键选项. Select next row包含如下选项: Sequential:顺序选择 R ...

  4. iOS 什么是函数式编程

    前言:当前只做理解性的常规背书,根据不断深入学习会不断丰富解读内容,欢迎评论提意见 函数式编程:Functional Programming 1 基本解释: 函数式编程 是一种思维模式,一种编程思想, ...

  5. jQuery UI入门

    jQuery UI是jQuery的一个插件集,为jQuery的核心库添加了新的功能. jQUery UI库可以从http://jquery.com下载. 下载一个ZIP文件jquery-ui-1.9. ...

  6. cocos打包出现错误,执行命令出错,返回值:2。 Traceback (most recent call last): File "E:\cocos_workspace\MyGameOne\proj.android\build_native.py", line 43, in <module> build(opts.build_mode) File "E:\cocos_workspace\MyGa

    先看看NDK的版本,如果不行,就删除\proj.android\obj\local\armeabi下的文件.

  7. 如何在IAR中配置CRC参数(转)

    源:如何在IAR中配置CRC参数 前言 STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间.CRC校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时 ...

  8. JS兼容各个浏览器的本地图片上传即时预览效果\、

    在firefox\chrome\ie10等浏览器中可以使用HTML5中的内容实现图片即时预览效果,在IE10以下浏览器中使用滤镜来解决图片显示问题. HTML5中的FileReader对象主要是把文件 ...

  9. HGVS的变异格式

    符号: 1.HGVS的变异格式由两部分组成: 1.1 reference sequence file identifier (accession.version-number) :  actual d ...

  10. PHP的垃圾回收机制以及大概实现

    垃圾回收,简称gc.顾名思义,就是废物重利用的意思.再说这个之前先接触一下内存泄露,大概意思就是申请了一块地儿拉了会儿屎,拉完之后不收拾,那么这块地就算糟蹋了,地越用越少,最后一地全是屎.说到底一句, ...