bzoj 5028: 小Z的加油店——带修改的区间gcd
Description
Input
Output
Sample Input
2 3 4
1 1 3
2 2 2 1
1 1 3
1 2 3
Sample Output
2
4
HINT
有可能出现L>R
——————————————————————————————
考虑一下更相减损术 题目就转换成了求区间gcd(带修改
这是一波套路题 考虑gcd(a,b,c,d,e)=gcd(a-b,b-c,c-d,d-e,e)
所以我们可以维护一下差分 也就是类似a-b这样的东西
这样之后区间l->r +v 就变成了 l-1 - v r +v
当然注意最后的e是不带差分的 所以还要维护一下原序列 方便查询右端点r
所以需要的操作就是 维护原序列的差分(单点修改区间查gcd)和原序列本身(区间加单点查询)
#include<cstdio>
#include<cstring>
#include<algorithm>
const int M=1e5+;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m,p;
int N,g[*M],bit[M],h[M];
int gcd(int x,int y){
while(y){p=x%y; x=y; y=p;}
return x;
}
void tr_modify(int x,int v){
g[x+=N]+=v;
for(x>>=;x;x>>=) g[x]=gcd(g[x<<],g[x<<^]);
}
#define lowbit(x) x&-x
int s[M];
void bit_insert(int x,int v){
while(x<=n){
s[x]+=v;
x+=lowbit(x);
}
}
int bit_query(int x){
int ans=h[x];
while(x) ans+=s[x],x-=lowbit(x);
return ans;
}
void modify(int l,int r,int v){
bit_insert(l,v); tr_modify(l-,-v);
bit_insert(r+,-v); tr_modify(r,v);
}
int push_ans(int l,int r){
int ans=bit_query(r);
for(l=l+N-,r=r+N;r-l!=;l>>=,r>>=){
if(~l&) ans=gcd(ans,g[l^]);
if(r&) ans=gcd(ans,g[r^]);
}
if(ans<) ans=-ans;
return ans;
}
void pd(int &x,int &y){if(x>y) std::swap(x,y);}
int main(){
int k,l,r,v;
n=read(); m=read();
for(int i=;i<=n;i++) h[i]=read();
for(N=;N<=n+;N<<=);
for(int i=;i<n;i++) g[i+N]=h[i]-h[i+];
for(int i=N-;i;i--) g[i]=gcd(g[i<<],g[i<<^]);
for(int i=;i<=m;i++){
k=read();
if(k==) l=read(),r=read(),pd(l,r),printf("%d\n",push_ans(l,r));
else l=read(),r=read(),v=read(),pd(l,r),modify(l,r,v);
}
return ;
}
bzoj 5028: 小Z的加油店——带修改的区间gcd的更多相关文章
- BZOJ 5028 小Z的加油店
[题解] 本题要求求出区间内的各个元素通过加减之后能够得出的最小的数,那么根据裴蜀定理可知答案就是区间内各个元素的最大公约数. 那么本题题意化简成了维护一个序列,支持区间加上某个数以及查询区间元素的最 ...
- 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. 这题的问题在线段树维护gcd只能支持修改成一个数,不支持加一个数. 套路:g ...
- BZOJ 5028 小z的加油站
bzoj链接 Time limit 10000 ms Memory limit 262144 kB OS Linux 感想 树上动态gcd的第二题也好了. [x] BZOJ 2257 [JSOI200 ...
- 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的加油店(线段树+差分)
题意:维护支持以下两种操作的序列:1 l r询问a[l...r]的gcd,2 l r x把a[l...r]全部+x 题解:一道经典题.根据gcd(a,b)=gcd(a-b,b)以及区间加可知,这题可以 ...
- 【bzoj5028】小Z的加油店 扩展裴蜀定理+差分+线段树
题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.$m$ 次操作,每次给 $[l,r]$ 内的瓶子容量增加 $ ...
- bzoj 4031: 小Z的房间 矩阵树定理
bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...
随机推荐
- 活动的生命周期 Android
1.运行程序 onCreate().onStart()和 onResume() 2.跳转到非弹框视图控制器 onPause()和 onStop() 返回上一个视图控制器(没被回收) onRestart ...
- 【多线程】 Task
[多线程] Task 一. 常用方法: 1. ContinueWith : 当前 Task 完成后, 执行传入的 Task 2. Delay : 创建一个等待的 Task,只有在调用 Wait 方法时 ...
- localStorage简析
声明:引用自http://www.cnblogs.com/st-leslie/p/5617130.html 一.什么是localStorage.sessionStorage 在HTML5中,新加入了一 ...
- 【app.json】配置说明,不断更新中
app.json文件用来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 注意: 1) json配置中键名.键值必须使用双引号,不能使用单引号. 2) 以 ...
- resetroot_169route_python2(用于ubuntu12.04和14.04,centos系列)
#!/usr/bin/python import os import json import subprocess from cloudinit.sources.DataSourceConfigDri ...
- DFS(5)——hdu1728逃离迷宫
一.题目回顾 题目链接:逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地 ...
- Week2 Teamework from Z.XML 软件分析与用户需求调查(二)应用助手功能评测
评测人:薛亚杰 周敏轩. 说明:言辞激烈,请勿介意. 软件使用概述 我们团队这次评测的必应助手是必应缤纷桌面的一个小功能,根据评测人员试用几天后发现,它的作用大概就是能够用一种看上去比较生动的形式来给 ...
- Github & DMCA Takedown Policy
Github & DMCA Takedown Policy Digital Millennium Copyright Act 数字千年版权法案 https://help.github.com/ ...
- delphi Edit 控制最大值,只能输入数字型 控制小数位数
delphi语言受众多程序员追捧,主要原因之一就是它有很多第三方的控件可供使用.很多资深的delphi程序员都把自己积累的函数.过程等设计成控件,以方便使用,提高开发效率. 本文通过一个只允许输入数字 ...
- P1268 树的重量
题目描述 树可以用来表示物种之间的进化关系.一棵“进化树”是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题是,根据物种之间的距离,重构相应的“进化树 ...