维护gcd的线段树 补发一波。。。
基础线段树(辣鸡的不行)
发现自己线段树除了会维护加法和乘法就啥也不会了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的线段树 补发一波。。。的更多相关文章
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- 【hdu5381】维护区间内所有子区间的gcd之和-线段树
题意:给定n个数,m个询问,每次询问一个区间内所有连续子区间的gcd的和.n,m<=10^5 题解: 这题和之前比赛的一题很像.我们从小到大枚举r,固定右端点枚举左端点,维护的区间最多只有log ...
- hdu 5381 The sum of gcd(线段树+gcd)
题目链接:hdu 5381 The sum of gcd 将查询离线处理,依照r排序,然后从左向右处理每一个A[i],碰到查询时处理.用线段树维护.每一个节点表示从[l,i]中以l为起始的区间gcd总 ...
- codeforces316E3 Summer Homework(线段树,斐波那契数列)
题目大意 给定一个n个数的数列,m个操作,有三种操作: \(1\ x\ v\) 将\(a_x\)的值修改成v $2\ l\ r\ $ 求 \(\sum_{i=l}^r x_i*f_{i-l}\) 其中 ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- Master of GCD 【线段树区间更新 || 差分】
Master of GCD 时间限制: 1 Sec 内存限制: 128 MB 提交: 670 解决: 112 [提交] [状态] [命题人:admin] 题目描述 Hakase has n num ...
- CSU 1809 - Parenthesis - [前缀和+维护区间最小值][线段树/RMQ]
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1809 Bobo has a balanced parenthesis sequenc ...
- 1798. [AHOI2009]维护序列【线段树】
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
随机推荐
- UVA 111 简单DP 但是有坑
题目传送门:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18201 其实是一道不算难的DP,但是搞了好久,才发现原来是题目没 ...
- 勤于思考:Objective-C特性的扩展
赋值 assign:直接赋值.默认 @interface Car : NSObject { NSString *_name; } @property (assign,nonatomic) NSStri ...
- struts2的结果类型
1.从struts-default.xml入手,得到结果类型列表以及对应的处理类: <result-types> <!-- 转发到action --> <result-t ...
- linux cpu占用100%排查
某服务器上部署了若干tomcat实例,即若干垂直切分的Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警. 问:如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代 ...
- u3d 多线程 网络
开启一个线程做网络连接,和接收数据, 用event进行广播 using UnityEngine; using System; using System.Threading; using System. ...
- hdu-5862 Counting Intersections(线段树+扫描线)
题目链接: Counting Intersections Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- ubuntu c++ 关机 重启 挂起 API
#include <unistd.h> #include <linux/reboot.h> int main() { reboot(LINUX_REBOOT_MAGIC1, L ...
- NO1:安装VMLinux虚拟机,安装配置Samba实现Linux与Windows文件共享
离开技术好些年,仅凭记忆开始学习.同时决定在Linux系统学习C语言. 一.下午安装了VM 8.0,安装RedHat Enterpris Server 6.4虚拟操作系统,都还比较顺利. 二.要实现L ...
- apache之访问本地文件,绑定域名
1.打开文件 C:\Windows\System32\drivers\etc\hosts,在文件末尾加上下面代码: 127.0.0.1 www.wangdongxue.com 2.打开Apache的配 ...
- matlab形态学图像处理之strel函数
转自:http://blog.sina.com.cn/s/blog_b1cd5d330101pmwi.html strel--structuring element 运用各种形状和大小构造元素,基本语 ...