Code:

#include <bits/stdc++.h>
#define N 50001
#define ll long long
#define lson now<<1
#define rson now<<1|1
#define inf 1000000000
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
ll A[N];
struct Matrix
{
ll a[3][3];
ll*operator[](int x) { return a[x]; }
void re() { memset(a,0,sizeof(a));}
void Min() { for(int i=0;i<3;++i) for(int j=0;j<3;++j) a[i][j]=-inf; }
ll getmax() { return max(a[0][1], a[2][1]); }
}t[N<<2];
Matrix operator*(Matrix a,Matrix b)
{
int i,j,k;
Matrix c; c.Min();
for(i=0;i<3;++i)
{
for(j=0;j<3;++j)for(k=0;k<3;++k) c[i][j]=max(c[i][j],a[i][k]+b[k][j]);
}
return c;
}
void pushup(int l,int r,int now)
{
t[now]=t[lson];
int mid=(l+r)>>1;
if(r>mid) t[now]=t[now]*t[rson];
}
void build(int l,int r,int now)
{
if(l==r)
{
t[now][0][0]=t[now][0][1]=t[now][2][0]=t[now][2][1]=A[l];
t[now][0][2]=t[now][1][0]=t[now][1][2]=-inf;
t[now][1][1]=t[now][2][2]=0;
return;
}
int mid=(l+r)>>1;
if(l<=mid) build(l,mid,lson);
if(r>mid) build(mid+1,r,rson);
pushup(l,r,now);
}
Matrix qmax(int l,int r,int now,int L,int R)
{
if(l>=L&&r<=R) return t[now];
int mid=(l+r)>>1;
Matrix re;
if(L<=mid)
{
re=qmax(l,mid,lson,L,R);
if(R>mid) re=re*qmax(mid+1,r,rson,L,R);
}
else
{
re=qmax(mid+1,r,rson,L,R);
}
return re;
}
void update(int l,int r,int now,int p,int v)
{
if(l==r)
{
A[p]=v;
t[now][0][0]=t[now][0][1]=t[now][2][0]=t[now][2][1]=v;
return;
}
int mid=(l+r)>>1;
if(p<=mid) update(l,mid,lson,p,v);
else update(mid+1,r,rson,p,v);
pushup(l,r,now);
}
int main()
{
// setIO("input");
int n,q,i,j;
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%lld",&A[i]);
build(1,n,1);
scanf("%d",&q);
for(i=1;i<=q;++i)
{
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op==0)
{
update(1,n,1,l,r);
}
else
{
if(l>r) swap(l,r);
printf("%lld\n",qmax(1,n,1,l,r).getmax());
}
}
return 0;
}

  

SP1716 GSS3(线段树+矩阵乘法)的更多相关文章

  1. 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法

    C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...

  2. hdu 5068(线段树+矩阵乘法)

    矩阵乘法来进行所有路径的运算, 线段树来查询修改. 关键还是矩阵乘法的结合律. Harry And Math Teacher Time Limit: 5000/3000 MS (Java/Others ...

  3. 【对不同形式矩阵的总结】WC 2009 最短路径问题(线段树+矩阵乘法)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4150 ​ 一个 \(6\times n\) 的网格图,每个格点有一个初始权值.有两种操作: 修改一个格子的权值 求 ...

  4. MAZE(2019年牛客多校第二场E题+线段树+矩阵乘法)

    题目链接 传送门 题意 在一张\(n\times m\)的矩阵里面,你每次可以往左右和下三个方向移动(不能回到上一次所在的格子),\(1\)表示这个位置是墙,\(0\)为空地. 现在有\(q\)次操作 ...

  5. CF718C Sasha and Array 线段树 + 矩阵乘法

    有两个操作: 将 $[l,r]$所有数 + $x$ 求 $\sum_{i=l}^{r}fib(i)$ $n=m=10^5$   直接求不好求,改成矩阵乘法的形式:  $a_{i}=M^x\times ...

  6. Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门  Portal  原题目描述在最下面.  简单的 ...

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

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

  8. HDU 5068 Harry And Math Teacher 线段树+矩阵乘法

    题意: 一栋楼有n层,每一层有2个门,每层的两个门和下一层之间的两个门之间各有一条路(共4条). 有两种操作: 0 x y : 输出第x层到第y层的路径数量. 1 x y z : 改变第x层 的 y门 ...

  9. [tsA1490][2013中国国家集训队第二次作业]osu![概率dp+线段树+矩阵乘法]

    这样的题解只能舔题解了,,,qaq 清橙资料里有.. #include <iostream> #include <cstdio> #include <cstdlib> ...

随机推荐

  1. package.json 版本解释

    指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本.波浪号(tilde)+ 指定版本:比如~1.2.2,表示安装1.2.x的最新版本(不低于1.2.2),但是不 ...

  2. Recovering BST CodeForces - 1025D (区间dp, gcd)

    大意: 给定$n$个数, 任意两个$gcd>1$的数间可以连边, 求是否能构造一棵BST. 数据范围比较大, 刚开始写的$O(n^3\omega(1e9))$竟然T了..优化到$O(n^3)$才 ...

  3. JVM 介绍

    JVM 介绍: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 ...

  4. 关于__new__和__init__

    关于__new__和__init__ 例如一个类 class Foo(object): def __init__(self): print(1) def __new__(self): print(2) ...

  5. Django rest-framework框架-组件之路由

    路由: a. url(r'^(?P<version>[v1|v2]+)/v1/$',views.ViewView.as_view()) url(r'^(?P<version>[ ...

  6. QTabWidget标签实现双击关闭(转)

    重载了QTabWidget(由于tabBar()是protected),这样就可以获取到标签了. 1 class Tab : public QTabWidget 2 { 3 Q_OBJECT 4 pu ...

  7. 【转】[STL]vector和deque的内存释放(clear)

    vector的clear成员函数可以清除vector中的元素,使其大小减至0.但它却不能减小vector占用的内存. [cpp] view plain copy int main() { vector ...

  8. php定界符介绍

    php界定符就是为了照样输出内容.它的格式如下: <<<EOF ...... EOF; 其中EOF是自定义的变量,但要成对出现! 首先附上一段php代码: <?php $a = ...

  9. React/react相关小结

    React React组件由React元素组成,React组件使用React.Component或React.PureComponent来生成:React元素使用JSX的语法来编写或使用React.c ...

  10. JavaScript 和 Java 是完全不同的语言

    JavaScript 和 Java 是完全不同的语言这个是定论,两者是概念http://www.gzaos.com还是设计都不同. JavaScript 在 1995 年由 Brendan Eich ...