[原]zoj3772--【水题】线段树区间查询+矩阵乘法
思路来源:http://blog.csdn.net/u013654696/article/details/23037407#comments
【做浙大校赛的时候没有看这道题,事后做的。思路不是自己的,但代码是自己敲的,由于伦家不懂如何用TeX敲出如此优美的公式,所以具体请看上面的博客链接(づ ̄3 ̄)づ╭。虽然说思路对应下的代码很好敲,但如果在比赛中我肯定不一定想得到这么做。在这道题中,线段树的节点与区间存的不是具体的值,是对应的一个矩阵。做了这道题也让我明白了线段树原来还可以那么好用吖(づ ̄3 ̄)づ╭❤~。以后对于这样的矩阵都可以用线段树来呢,建矩阵线段树的时间复杂度是O(nlogn)。】
总结:(ー`´ー)敲了一天,开始是体会错公式了,结果乘多了最后两个矩阵,后来又忘记取余了~~~这个逗比的教训告诉我们,做事要细心~~还有代码写矬了果断删掉重写!
下面上AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 100010
#define mod 1000000007
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 long long fun[maxn];
long long num[maxn<<2];
int n, m; class matrix{
public:
long long mat[2][2];
matrix()
{
mat[0][0] = mat[1][1] = 1;
mat[0][1] = mat[1][0] = 0;
}
matrix(long long a)
{
mat[0][0] = mat[1][0] = 1;
mat[0][1] = a;
mat[1][1] = 0;
}
matrix operator*(const matrix& m)const
{
matrix tmp;
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++){
tmp.mat[i][j] = 0;
for(int k = 0; k < 2; k++)
{
tmp.mat[i][j] += mat[i][k] * m.mat[k][j] % mod;
tmp.mat[i][j] %= mod;
}
}
return tmp;
}
}; matrix sgt[maxn<<2];
void pushup(int rt)
{
sgt[rt] = sgt[rt<<1|1] * sgt[rt<<1]; //注意矩阵乘的方向!!
} void build(int l, int r, int rt)
{
if(l == r)
{
sgt[rt] = matrix(fun[l]);
return;
}
int m = (l+r)>>1;
build(lson);
build(rson);
pushup(rt);
} matrix query(int l, int r, int rt, int L, int R)
{
if(L <= l && r <= R)
{
return sgt[rt];
}
int m = (l + r)>>1;
matrix tmp;
if(m < R) tmp = tmp * query(rson, L, R); //注意矩阵乘的方向!!
if(L <= m) tmp = tmp * query(lson, L, R);
return tmp;
} long long result(int l, int r, int rt, int L, int R)
{
if(R - L < 2) //判断区间长度,小于等于二的直接输出右区间;
{
return fun[R];
}
matrix tmp;
tmp = query(l, r, rt, L+2, R);
long long a;
a = tmp.mat[0][0] * fun[L+1] + tmp.mat[0][1] * fun[L];
a %= mod;
return a;
} int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &fun[i]);
build(1, n, 1);
long long a;
for(int i = 0; i < m; i++)
{
a = 0;
int c, d;
scanf("%d%d", &c, &d);
a = result(1, n, 1, c, d);
printf("%d\n",a);
}
}
return 0;
}
[原]zoj3772--【水题】线段树区间查询+矩阵乘法的更多相关文章
- Codeforces 750E - New Year and Old Subsequence(线段树维护矩阵乘法,板子题)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 我做这道 *2600 的动力是 wjz 出了道这个套路的题,而我连起码的思路都没有,wtcl/kk 首先考虑怎样对某个固定的串计 ...
- Codeforces 1368H - Breadboard Capacity(最小割+线段树维护矩阵乘法)
Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色 ...
- CF633H Fibonacci-ish II 莫队、线段树、矩阵乘法
传送门 这题除了暴力踩标程和正解卡常数以外是道很好的题目 首先看到我们要求的东西与\(Fibonacci\)有关,考虑矩阵乘法进行维护.又看到\(n \leq 30000\),这告诉我们正解算法其实比 ...
- 【CF1252K】Addition Robot(线段树,矩阵乘法)
题意: 思路:因为线段树上每一段的矩阵之积只有两种,预处理一下,翻转的时候下传tag然后把另一种可能性换上来就好 #include<bits/stdc++.h> using namespa ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- 线段树维护矩阵【CF718C】 Sasha and Array
Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
- 「CQOI2006」简单题 线段树
「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...
- Subsequence Count 2017ccpc网络赛 1006 dp+线段树维护矩阵
Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0's and 1's), and Q queries ...
随机推荐
- BZOJ 4500: 矩阵 差分约束
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4500 题解: 从行向列建边,代表一个格子a[i][j],对每个顶点的所有操作可以合并在一 ...
- [工作积累] NDK通过Java获取package name 和version
////////////////////////////////////////////////////////////////////////// //Java code snippet //get ...
- UML状态图(转载)
概述: 图表本身的名称,阐明该图的目的和其他细节.它描述了在一个系统中的一个组成部分不同的状态.状态是特定的一个系统的组件/对象. 状态图描述了一个状态机.我们阐明的状态机可以被定义为一台机器,它定义 ...
- shell 运算
一个下午折腾一个脚本,shell好久不用,重新学起 一个小成果 size= ] do table=albums_index_${table_num} count=$size times= while ...
- codechef 两题
前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...
- 大漠推荐的教程:创建你自己的AngularJS -- 第一部分 Scopes
创建你自己的AngularJS -- 第一部分 Scopes http://www.html-js.com/article/1863
- applicationContext.xml xxx-servlet.xml
applicationContext.xml是随ContextLoaderListener的加载而执行的,而xxx-servlet.xml是随DispatcherServlet的加载而执行的,在web ...
- *args和**kw魔法参数
学Python挺久了,现在才搞懂这个还是有点惭愧 *args:传入元组,无关键字 **kw:传入字典,有关键字 示例: *args **kw 一起使用时args的参数需在前:
- linux权威指南 简记
/proc 目录,linxu系统以文件形式存放进程信息,这是一个虚拟的文件系统,不占有任何磁盘空间,当读取该文件系统时,系统内核会拦截动作,并动态产生文件与目录的内容 查看该文件夹,会发现很多已数字命 ...
- 九个衡量 Rails 应用性能的小方法
你有个绝佳的商业创意,日复一日地将它完善丰满起来.后来,你雇了一群天赋异禀的开发者.Web 设计师和用户体验专家,他们用一种非常棒的框架--Ruby on Rails 帮你实现长久以来的梦想. 你的网 ...