基础线段树(辣鸡的不行)


发现自己线段树除了会维护加法和乘法就啥也不会了QWQ太菜了

瞎写了一个维护gcd的

首先,gcd(x,y)= gcd(x,y-x) 并且很容易推广到n个数,所以我们可以把原数组差分一下,

find时就左右子树大力合并gcd,最后和左端点元素本身取gcd;

upd时就直接修改差分数组的端点,同时用树状数组维护原数组变化量;轻松加愉悦。

#include<cstdio>
#include<iostream>
#include<cmath>
#define ll long long
#define R register ll
#define ls tr<<1
#define rs tr<<1|1
using namespace std;
const int N=;
ll w[N<<],c[N],a[N],n,m;
inline ll g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
inline ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
inline void build(int tr,int l,int r) {
if(l==r) {w[tr]=a[l]-a[l-]; return;}
R md=(l+r)>>;
build(ls,l,md),build(rs,md+,r);
w[tr]=gcd(w[ls],w[rs]);
}
inline ll find(int tr,int l,int r,int LL,int RR) {
if(l==LL&&r==RR) return abs(w[tr]);
R md=(l+r)>>;
if(RR<=md) return find(ls,l,md,LL,RR);
else if(LL>md) return find(rs,md+,r,LL,RR);
else return abs(gcd(find(ls,l,md,LL,md),find(rs,md+,r,md+,RR)));
}
inline void upd(int tr,int l,int r,int pos,ll inc) {
if(l==r) {w[tr]+=inc; return ;}
R md=(l+r)>>;
if(pos<=md) upd(ls,l,md,pos,inc);
else upd(rs,md+,r,pos,inc);
w[tr]=gcd(w[ls],w[rs]);
}
inline int lbt(int x) {return x&-x;}
inline ll ask(int pos) {R ret=; for(;pos;pos-=lbt(pos)) ret+=c[pos]; return ret;}
inline void add(int pos,ll inc) {for(;pos<=n;pos+=lbt(pos)) c[pos]+=inc;}
signed main() {
n=g(),m=g();
for(R i=;i<=n;++i) a[i]=g();
build(,,n);
while(m--) { register char ch;
while(!isalpha(ch=getchar())); register int l=g(),r=g(); R inc;
if(ch=='Q') printf("%lld\n",gcd(a[l]+ask(l),find(,,n,l+,r)));
else {
inc=g();add(l,inc);upd(,,n,l,inc),add(r+,-inc);
if(r<n) upd(,,n,r+,-inc);
}
}
}

2019.04.07

维护gcd的线段树 补发一波。。。的更多相关文章

  1. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  2. 【hdu5381】维护区间内所有子区间的gcd之和-线段树

    题意:给定n个数,m个询问,每次询问一个区间内所有连续子区间的gcd的和.n,m<=10^5 题解: 这题和之前比赛的一题很像.我们从小到大枚举r,固定右端点枚举左端点,维护的区间最多只有log ...

  3. hdu 5381 The sum of gcd(线段树+gcd)

    题目链接:hdu 5381 The sum of gcd 将查询离线处理,依照r排序,然后从左向右处理每一个A[i],碰到查询时处理.用线段树维护.每一个节点表示从[l,i]中以l为起始的区间gcd总 ...

  4. codeforces316E3 Summer Homework(线段树,斐波那契数列)

    题目大意 给定一个n个数的数列,m个操作,有三种操作: \(1\ x\ v\) 将\(a_x\)的值修改成v $2\ l\ r\ $ 求 \(\sum_{i=l}^r x_i*f_{i-l}\) 其中 ...

  5. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  6. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  7. Master of GCD 【线段树区间更新 || 差分】

    Master of GCD 时间限制: 1 Sec  内存限制: 128 MB 提交: 670  解决: 112 [提交] [状态] [命题人:admin] 题目描述 Hakase has n num ...

  8. CSU 1809 - Parenthesis - [前缀和+维护区间最小值][线段树/RMQ]

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1809 Bobo has a balanced parenthesis sequenc ...

  9. 1798. [AHOI2009]维护序列【线段树】

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

随机推荐

  1. test pic重复

  2. hdu-5818 Joint Stacks(模拟)

    题目链接: Joint Stacks Time Limit: 8000/4000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Othe ...

  3. MySQL当月负毛利订单明细_20161027

    #当月每天负毛利订单明细 SELECT c.ID,a.city AS 城市,a.username AS 用户ID,a.订单日期,a.订单号,a.销售确认额,a.成本额,a.毛利1, CASE THEN ...

  4. 「UVA1636」Headshot(概率

    题意翻译 你有一把枪(左轮的),你随机装了一些子弹,你开了一枪,发现没有子弹,你希望下一枪也没有子弹,你是应该直接开一枪(输出"SHOOT"),还是先转一下,再开一枪(输出&quo ...

  5. BZOJ3110:[ZJOI2013]K大数查询

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  6. C#如何把XSD中HexBinary类型序列化uint类型

    xml schema中有hexBinary类型, 我们在实现C#的Serialization时,一般默认把hexBinary映射为byte[],但是有些情况我们需要把 hexBinary映射为uint ...

  7. Python手动安装 package

    https://pypi.python.org/pypi 下载 解压 进入setup.py的目录 python setup.py build python setup.py install

  8. ceph 删除了osd但是osd目录保存完整如何恢复

    1. 这里假设有一个osd被删除了 执行下列步骤删除: ceph osd out osd.0 service ceph stop osd.0 ceph osd crush remove osd.0 c ...

  9. [hdu4311]Meeting point-1

    题意:在整数坐标轴上找一个距离所有给定点距离最小的点. 解题关键:对x和y分别处理,前缀和预处理所有点到最小点的距离,每点的$sum$等于左边的贡献+右边的贡献,最后取$min$即可. 复杂度:$O( ...

  10. DOM,API,CSS,href,万方db文章,数据库工程师要求

    DOM,文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展标志语言的标准编程接口. API,应用程序接口 (API:Application Program Int ...