bzoj5028小Z的加油店(线段树+差分)
题意:维护支持以下两种操作的序列:1 l r询问a[l...r]的gcd,2 l r x把a[l...r]全部+x
题解:一道经典题。根据gcd(a,b)=gcd(a-b,b)以及区间加可知,这题可以差分求解。然后只需要维护支持单点加减和区间查询gcd、差分和的线段树即可,复杂度O(nlog2n),因为要求区间gcd。
#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int N=1e5+;
int n,m,a[N],d[N<<],s[N<<];
void pushup(int rt){d[rt]=__gcd(d[rt<<],d[rt<<|]),s[rt]=s[rt<<]+s[rt<<|];}
void build(int l,int r,int rt)
{
if(l==r){d[rt]=s[rt]=a[l];return;}
int mid=l+r>>;
build(lson),build(rson);
pushup(rt);
}
void update(int k,int v,int l,int r,int rt)
{
if(l==r){a[l]+=v,d[rt]=s[rt]=a[l];return;}
int mid=l+r>>;
if(k<=mid)update(k,v,lson);else update(k,v,rson);
pushup(rt);
}
int query_d(int L,int R,int l,int r,int rt)
{
if(L>R)return ;
if(L<=l&&r<=R)return d[rt];
int mid=l+r>>,ret=;
if(L<=mid)ret=__gcd(ret,query_d(L,R,lson));
if(R>mid)ret=__gcd(ret,query_d(L,R,rson));
return ret;
}
int query_s(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)return s[rt];
int mid=l+r>>,ret=;
if(L<=mid)ret+=query_s(L,R,lson);
if(R>mid)ret+=query_s(L,R,rson);
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=n;i;i--)a[i]-=a[i-];
build(,n,);
while(m--)
{
int op,l,r,x;scanf("%d%d%d",&op,&l,&r);
if(op==)printf("%d\n",abs(__gcd(query_d(l+,r,,n,),query_s(,l,,n,))));
else{
scanf("%d",&x);
update(l,x,,n,);
if(r<n)update(r+,-x,,n,);
}
}
}
bzoj5028小Z的加油店(线段树+差分)的更多相关文章
- D - 小Z的加油店 线段树+差分+GCD
D - 小Z的加油店 HYSBZ - 5028 这个题目是一个线段树+差分+GCD 推荐一个差分的博客:https://www.cnblogs.com/cjoierljl/p/8728110.ht ...
- [BZOJ5028]小Z的加油店
[BZOJ5028]小Z的加油店 题目大意: 一个长度为\(n(n\le10^5)\)的数列,\(m(m\le10^5)\)次操作,支持区间加和区间\(\gcd\). 思路: 线段树维护差分,\(\g ...
- 【bzoj5028】小Z的加油店 扩展裴蜀定理+差分+线段树
题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.$m$ 次操作,每次给 $[l,r]$ 内的瓶子容量增加 $ ...
- 5028: 小Z的加油店(线段树)
NOI2012魔幻棋盘弱化版 gcd(a,b,c,d,e)=gcd(a,b-a,c-b,d-c,e-d) 然后就可以把区间修改变成差分后的点修了. 用BIT维护原序列,线段树维护区间gcd,支持点修区 ...
- bzoj 5028: 小Z的加油店——带修改的区间gcd
Description 小Z经营一家加油店.小Z加油的方式非常奇怪.他有一排瓶子,每个瓶子有一个容量vi.每次别人来加油,他会让 别人选连续一段的瓶子.他可以用这些瓶子装汽油,但他只有三种操作: 1. ...
- 【BZOJ】5028: 小Z的加油店
[算法]数学+线段树/树状数组 [题解] 首先三个操作可以理解为更相减损术或者辗转相除法(待证明),所以就是求区间gcd. 这题的问题在线段树维护gcd只能支持修改成一个数,不支持加一个数. 套路:g ...
- BZOJ 5028 小Z的加油店
[题解] 本题要求求出区间内的各个元素通过加减之后能够得出的最小的数,那么根据裴蜀定理可知答案就是区间内各个元素的最大公约数. 那么本题题意化简成了维护一个序列,支持区间加上某个数以及查询区间元素的最 ...
- 牛客小白月赛16 H小阳的贝壳 (线段树+差分数组)
链接:https://ac.nowcoder.com/acm/contest/949/H来源:牛客网 题目描述 小阳手中一共有 n 个贝壳,每个贝壳都有颜色,且初始第 i 个贝壳的颜色为 colico ...
- 【BZOJ4031】小Z的房间(矩阵树定理)
[BZOJ4031]小Z的房间(矩阵树定理) 题面 BZOJ 洛谷 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子 ...
随机推荐
- [翻译]:MySQL Error: Too many connections
翻译:MySQL Error: Too many connections 前言: 本文是对Muhammad Irfan的这篇博客MySQL Error: Too many connections的 ...
- AXI-Lite总线及其自定义IP核使用分析总结
ZYNQ的优势在于通过高效的接口总线组成了ARM+FPGA的架构.我认为两者是互为底层的,当进行算法验证时,ARM端现有的硬件控制器和库函数可以很方便地连接外设,而不像FPGA设计那样完全写出接口时序 ...
- Github上html页面(包括CSS样式和JS效果)如何显示出来
在看Github上项目时,发现有的html页面效果能很好的展现出来,而有的则不能.对这个问题很好奇,因此研究了一下,最终做到了将页面展示出来的目的.下面以我的Github的开源项目bootstrap- ...
- Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Clien
https://blog.csdn.net/asahinokawa/article/details/84746422
- JavaScript 面向对象之原型对象
原型的概述 我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法. 逻辑上可以这么理解:prototype 通过调用构 ...
- 重写override
不可重写私有方法. 不可重写非静态的方法,虽然编译器不会报错,但是得不到预期的结果. 可以通过重写的形式对父类的功能进行重新定义,比如:对功能进行修改或者进行升级时. class BaseAction ...
- SpringBoot四大核心
auto-configuration.starters.cli.actuator
- Clion 配置
plugins: one dark theme font : fira code retina
- linux用户身份和文件权限
1.用户身份与能力 root管理员是linux 的超级用户,他拥有系统的所有权,能够管理系统的各项功能,如添加/删除用户,启动/关闭服务进程,开启/禁用硬件设备…… "Linux系统中的管理 ...
- Skyline 7 版本TerraExplorer Pro二次开发快速入门
年底了,给大家整理了一下Skyline 7版本的二次开发学习初级入门教程,献给那些喜欢学习的年轻朋友. 我这整理的是Web控件版本的开发示例,里面页面代码保存成html,都可以直接运行的. 测试使用的 ...