[原]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 ...
随机推荐
- DFS-HDU 1312 -Red and Black
D - Red and Black Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- 【转载】Android异步处理系列文章
本博文地址:http://blog.csdn.net/mylzc/article/details/6777767 转载请注明出处. 为了给用户带来良好的交互体验,在Android应用的开发过程中需要把 ...
- 【BZOJ】【1027】【JSOI2007】合金
计算几何/凸包/Floyd Orz rausen大爷太强辣 计算几何题目果然不会做>_> 这个题……虽然他给了3个坐标,但实际上是个二维的计算几何题= =因为第三维坐标可以直接用前两维坐标 ...
- 【BZOJ】【1202】【HNOI2005】狡猾的商人
Orz iwtwiioi http://www.cnblogs.com/iwtwiioi/p/3887617.html 并查集+前缀和 啊……这题应该是水题吧?但是我这个大沙茶居然一天都没想出来…… ...
- IOS CoreData 多表查询demo解析
在IOS CoreData中,多表查询上相对来说,没有SQL直观,但CoreData的功能还是可以完成相关操作的. 下面使用CoreData进行关系数据库的表与表之间的关系演示.生成CoreData和 ...
- SQL Server 监控 使用sp_trace_create
监控前言 上一节我们提到了MSSQL的基于SQL Event的监控,但是有些时候我们需要更加详细.适用于调优排错的监控.SQL Server内部运行的可见性是的查询调整.优化和综合排查成为可能!这一节 ...
- windows_phone指定时间后执行函数
开发windows phone 应用程序时需要在一段指定的时间后执行某些函数,于是乎想到了通过DispatcherTimer类来实现,再在.Tick后面添加自己想要的事件 DispatcherTime ...
- Sqli-labs less 35
Less-35 35关和33关是大致的一样的,唯一的区别在于sql语句的不同. $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"; ...
- 通过Docker配置DNS服务器
1. 概述 DockerHub中的 sameersbn/bind 镜像提供了搭建DNS服务器的功能,本文给出使用该镜像搭建DNS服务器的例子. 2. 环境 DNS服务器主机 IP:10.11.150. ...
- acdream1116 Gao the string!(hash二分 or 后缀数组)
问题套了一个斐波那契数,归根结底就是要求对于所有后缀s[i...n-1],所有前缀在其中出现的总次数.我一开始做的时候想了好久,后来看了别人的解法才恍然大悟.对于一个后缀来说 s[i...n-1]来说 ...