codeforces 373div1 Sasha and Array 矩阵+线段树
来源:互联网 发布:淘宝低价销售的危害 编辑:程序博客网 时间:2024/05/21 08:46
用线段树储存价值和,因为矩阵 a1 * b + a2 * b + a3 * b + a4 * b + a5 * b = (a1 + a2 + a3 + a4 + a5) * b;
然后进行下优化,尽量减少快速幂的运算数量
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#define lson i<<1#define rson (i<<1) + 1#define maxn 100005#define LL long longusing namespace std;int n,k,b,m;LL mod = 1000000007ll;//快速幂struct ma{ int m[2][2],row,col; ma() { memset(m,0,sizeof(m)); row = col = 0; } ma operator * (ma ma1) //乘 { ma ans; ans.row = row; ans.col = ma1.col; for(int i = 0;i < ans.row;i++) for(int j = 0;j < ans.col;j++) { for(int k = 0;k < col;k++) { ans.m[i][j] = (ans.m[i][j] + ((LL)m[i][k] * ma1.m[k][j])) % mod; } } return ans; } ma operator + (ma ma1) //加 { ma ans; ans.row = row; ans.col = col; for(int i = 0;i < row;i++) for(int j = 0;j < col;j++) { ans.m[i][j] = ma1.m[i][j] + m[i][j]; ans.m[i][j] %= mod; } return ans; } ma operator^(int n) // 快速幂 { ma ans,ma1; ans.row = row; ans.col = col; for(int i = 0;i < row;i++) ans.m[i][i] = 1; ma1.row = row; ma1.col = col; for(int i = 0;i < row;i++) for(int j = 0;j < col;j++) ma1.m[i][j] = m[i][j]; while(n) { if(n&1)ans = ans * ma1; ma1 = ma1 * ma1; n >>= 1; } return ans; }}E, mul;ma va[maxn * 4], add[maxn * 4];void pushUp(int i){ va[i] = va[lson] + va[rson];}void pushDown(int i){ va[lson] = va[lson] * add[i]; va[rson] = va[rson] * add[i]; add[lson] = add[lson] * add[i]; add[rson] = add[rson] * add[i]; add[i] = E;}void build(int i, int l, int r){ add[i] = E; if(l == r) { int pre; scanf("%d", &pre); pre--; va[i] = mul ^ pre; return; } int mid = (l + r) / 2; build(lson , l, mid); build(rson , mid + 1, r); pushUp(i);}void update(int i, int l, int r, int L , int R, ma ADD){ if(l == L && r == R) { va[i] = va[i] * ADD; add[i] = add[i] * ADD; return; } pushDown(i); int mid = (l + r) / 2; if(R <= mid) update(lson, l, mid, L, R, ADD); else if(L > mid) update(rson, mid + 1, r, L, R, ADD); else{ update(lson, l, mid, L , mid, ADD); update(rson, mid + 1, r, mid + 1, R, ADD); } pushUp(i);}int query(int i, int l, int r, int L, int R){ if(l == L && r == R) { return va[i].m[0][0]; } pushDown(i); int mid = (l + r) / 2; if(R <= mid) return query(lson, l, mid, L , R); else if(L > mid) return query(rson, mid + 1, r, L, R); else{ return (query(lson, l, mid, L , mid) + query(rson, mid + 1, r, mid + 1, R))%mod; }}int main(){ E.row = 2, E.col = 2; E.m[0][0] = 1, E.m[0][1] = 0; E.m[1][0] = 0, E.m[1][1] = 1; mul.row = 2, mul.col = 2; mul.m[0][0] = 1, mul.m[0][1] = 1; mul.m[1][0] = 1, mul.m[1][1] = 0; scanf("%d%d", &n,&m); build(1, 1, n); while(m--) { int flag; scanf("%d", &flag); int a, b, c; if(flag == 1){ scanf("%d%d%d", &a, &b, &c); ma ADD = (mul ^ c); update(1, 1, n, a, b, ADD); } else { scanf("%d%d", &a,&b); printf("%d\n", query(1, 1, n, a, b)); } } return 0;}
0 0
- codeforces 373div1 Sasha and Array 矩阵+线段树
- cf/Codeforces Round #373 div1-C/div2-E Sasha and Array 线段树 + 维护矩阵快速幂
- Codeforces 718C Sasha and Array(线段树维护矩阵)
- Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵
- [Codeforces 719 E. Sasha and Array] 矩阵快速幂+线段树
- CodeForces-719E Sasha and Array(线段树+矩阵快速幂)
- 【CodeForces 719E】【线段树+矩阵快速幂】 Sasha and Array
- CodeForces 719E Sasha and Array 【线段树】【快速矩阵幂】
- CodeForces - 719E Sasha and Array 线段树 + 矩阵快速幂
- CodeForces 718C Sasha and Array(矩阵类+线段树)
- 线段树+矩阵快速幂 codeforces718C Sasha and Array
- E. Sasha and Array——矩阵+线段树
- 【Codeforces 718C&719E】Sasha and Array【线段树成段更新+矩阵快速幂】
- [codeforces] 719E Sasha and Array 线段树+快速斐波那契
- Codeforces Round #373 (Div. 1) C.Sasha and Array
- Codeforces Round #373 (Div. 2) E. Sasha and Array
- Codeforces Round #373 (Div. 2) E. Sasha and Array
- [Codeforces Round #373 DIV1C (CF718C)] Sasha and Array
- 从输入URL到页面加载发生了什么
- 使用python爬虫爬取百度手机助手网站中app的数据
- Neural Networks and Deep Learning CH1
- Android中引用资源的方法总结
- 对极几何基本概念
- codeforces 373div1 Sasha and Array 矩阵+线段树
- 计算机网络概述
- dispatcherServlet,HandlerMapping,HandlerAdapter
- 【机器学习】Learning to Rank之Ranking SVM 简介
- Codeforces Round #340 (Div. 2)-C. Watering Flowers
- 从1开始学习java一个月后总结心得
- 平方数
- angular $resource模块
- c++没有垃圾回收机制的原因