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


发现自己线段树除了会维护加法和乘法就啥也不会了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. PHP的引用详解【转】

    摘自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/10/2173092.html 官方文档: 1.引用是什么:http://ww ...

  2. LNMP安装(一)

    前传: 环境介绍: Centos7.2-minimal 下载地址:http://mirrors.163.com/centos/7.2.1511/isos/x86_64/ (网易镜像站) 所需安装包:链 ...

  3. 枚举类型的使用方法enum

    一.枚举类型的使用方法 一般的定义方式如下: enum enum_type_name { ENUM_CONST_1, ENUM_CONST_2, ... ENUM_CONST_n } enum_var ...

  4. C/C++ 混合编程

    [面试] C/C++ 语法(五) -- extern 1. C 调用 C++ 开发的DLL库 C和C++混合编程(__cplusplus 与 external "c" 的使用) # ...

  5. oracle 11g 常用命令

    sqlplus system/123@ORCL; 查看oracle字符集: select * from nls_database_parameters where parameter ='NLS_CH ...

  6. appium 支持输入中文

    加入: desired_caps['unicodeKeyboard'] = True desired_caps['resetKeyboard'] = True 使用输入中文: input_txt = ...

  7. python输入空格间隔的一行int

    str = input() list = [int(x) for x in str.split()] print(list) 用py刷题肯定得遇到空格间隔的键入,先str接收键入的一行字串,然后把st ...

  8. WaitHandle.WaitAll 方法在WPF工程中的应用

    因为WaiAll需要多线程支持, 而WPF是STA模式, 可以通过以下方式实现WaitAll ManualResetEvent[] events:  foreach (ManualResetEvent ...

  9. 使用远程线程来注入DLL

    使用远程线程来注入DLL DLL注入技术要求我们目标进程中的一个线程调用LoadLibrary来载入我们想要的DLL (1)用OpenProcess函数打开目标进程(2)用VirtualAllocEx ...

  10. 设置Android让EditText不自动获取焦点

    最近在做一个练手项目的时候,因为默认进入的页面有一个EditText控件,每次进入的时候会自动获取焦点弹出软键盘,体验非常不好,后来在网上找到了解决办法:在EditText的父级控件中找到以下属性,设 ...