CH 4302 Interval GCD
辗转相减法的扩展 $gcd(x, y, z) = gcd(x, y - x, z - y)$ 当有n个数时也成立
所以构造$a_{i}$的差分数组$b_{i} = a_{i} - a_{i - 1}$,用一个线段树来维护b数组的gcd,这样每次区间修改相当于两次单点修改
考虑到询问的时候$ans = gcd(a_{l}, query(l +1, r))$所以我们再维护原数组a的值,直接差分之后用一个树状数组就好了
注意判断边界情况。
Code:
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = 5e5 + ; int n, qn;
ll a[N], b[N]; ll gcd(ll x, ll y) {
return (!y) ? x : gcd(y, x % y);
} template <typename T>
inline void read(T &X) {
X = ;
char ch = ;
T op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} struct BinaryIndexTree {
ll s[N]; #define lowbit(x) ((x) & (-x)) inline void add(int x, ll v) {
for(; x <= n; x += lowbit(x))
s[x] += v;
} inline ll query(int x) {
ll res = ;
for(; x > ; x -= lowbit(x))
res += s[x];
return res;
} } B; struct SegT {
ll s[N << ]; #define lc p << 1
#define rc p << 1 | 1
#define mid ((l + r) >> 1) inline void up(int p) {
if(p) s[p] = gcd(s[lc], s[rc]);
} void build(int p, int l, int r) {
if(l == r) {
s[p] = b[l];
return;
} build(lc, l, mid);
build(rc, mid + , r);
up(p);
} void modify(int p, int l, int r, int x, ll v) {
if(x == l && x == r) {
s[p] += v;
return;
} if(x <= mid) modify(lc, l, mid, x, v);
else modify(rc, mid + , r, x, v);
up(p);
} ll query(int p, int l, int r, int x, int y) {
if(x > y) return 1LL;
if(x <= l && y >= r) return s[p];
ll res;
if(x <= mid && y > mid)
res = gcd(query(lc, l, mid, x, y), query(rc, mid + , r, x, y));
else if(y <= mid) res = query(lc, l, mid, x, y);
else if(x > mid) res = query(rc, mid + , r, x, y);
return res;
} } A; inline ll abs(ll x) {
return x > ? x : -x;
} int main() {
read(n), read(qn);
for(int i = ; i <= n; i++) read(a[i]); for(int i = ; i <= n; i++) b[i] = a[i] - a[i - ];
for(int i = ; i <= n; i++) B.add(i, b[i]);
A.build(, , n); char op[];
for(int x, y; qn--; ) {
scanf("%s", op);
read(x), read(y);
if(op[] == 'C') {
ll v;
read(v);
B.add(x, v), A.modify(, , n, x, v);
if(y < n) B.add(y + , -v), A.modify(, , n, y + , -v);
} else {
if(x < y) printf("%lld\n", gcd(B.query(x), abs(A.query(, , n, x + , y))));
else printf("%lld\n", B.query(x));
}
} return ;
}
CH 4302 Interval GCD的更多相关文章
- CH 4302 Interval GCD 题解
题意 给定一个长度为N的数列A,以及M条指令 (N≤5* 10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-, ...
- CH4302 Interval GCD
题意 4302 Interval GCD 0x40「数据结构进阶」例题 描述 给定一个长度为N的数列A,以及M条指令 (N≤5*10^5, M<=10^5),每条指令可能是以下两种之一: &qu ...
- JSOI2009 等差数列 和 算术天才⑨与等差数列 和 CH4302 Interval GCD
等差数列 为了检验学生的掌握情况,jyy布置了一道习题:给定一个长度为N(1≤N≤100,000)的数列,初始时第i个数为vi(vi是整数,−100,000≤vi≤100,000),学生们要按照jyy ...
- CH Round #53 -GCD Path
描述 给定一张N个点的有向图,点i到点j有一条长度为 i/(gcd(i,j))的边.有Q个询问,每个询问包含两个数x和y,求x到y的最短距离. 输入格式 第一行包含两个用空格隔开的整数,N和Q. 接下 ...
- 【CH4302】Interval GCD
题目大意:给定一个长度为 N 的序列,M 个操作,支持区间加,区间查询最大公约数. 题解: 先来看一个子问题,若是单点修改,区间最大公约数,则可以发现,每次修改最多改变 \(O(logn)\) 个答案 ...
- Interval GCD
题目描述 给定一个长度为N的数列A,以及M条指令 (N≤5*10^5, M<=10^5),每条指令可能是以下两种之一:“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d ...
- 【线段树】Interval GCD
题目描述 给定一个长度为N的数列A,以及M条指令 (N≤5*10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],- ...
- 更加精确的定时器:dispatch_source_t
在使用定时器时,我们经常使用NSTimer,但是由于NSTimer会受RunLoop影响,当RunLoop处理的任务很多时,就会导致NSTimer的精度降低,所以在一些对定时器精度要求很高的情况下,应 ...
- Codeforces Round #379 (Div. 2) Analyses By Team:Red & Black
A.Anton and Danik Problems: 给你长度为N的,只含'A','D'的序列,统计并输出何者出现的较多,相同为"Friendship" Analysis: lu ...
随机推荐
- CodeForces 589H Tourist Guide
传送门 题目大意 给定$n$个点$m$条边的无向图,有$K$个关键点,你要尽可能的让这些关键点两两匹配,使得所有点对之间可以通过简单路径连接且任意两个简单路径没有重复的边(可以是共同经过一个点),输出 ...
- BZOJ3302: [Shoi2005]树的双中心
BZOJ3302: [Shoi2005]树的双中心 https://lydsy.com/JudgeOnline/problem.php?id=3302 分析: 朴素算法 : 枚举边,然后在两个连通块内 ...
- LdapContext获取对象的属性
// dn = "cn=1,cn=Users,DC=域名,DC=COM";// Attributes answer = ctx.getA ...
- 蓝桥杯 算法训练 ALGO-149 5-2求指数
算法训练 5-2求指数 时间限制:1.0s 内存限制:256.0MB 问题描述 已知n和m,打印n^1,n^2,...,n^m.要求用静态变量实现.n^m表示n的m次方.已知n和m,打印n^ ...
- Boost.Asio基本原理(CSDN也有Markdown了,好开森)
Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...
- Mybatis Laz-Load功能实现代码赏析(原创)
对于Mybatis 拥有的Lazy Load(有中文翻译成延迟加载)功能,应该很同学都有听说过,今天主要与大家一起来解读一下Mybatis在Lazy Load功能的实现的代码.Lazy Load实现的 ...
- 数据库:ubantu下MySQL安装指南
http://wiki.ubuntu.org.cn/MySQL%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97 安装MySQL sudo apt-get install mys ...
- python中的 ' ' 和 " "
#!/usr/bin/python import MySQLdb try: conn = MySQLdb.connect(host = 'localhost', user = 'root', pass ...
- 如何配置nagios监控SUN(富士通)MX000系列服务器的XSCF
配置环境说明 192.168.3.80-XSCF地址 192.168.2.80-solaris操作系统IP地址 (nagios客户端) 192.168.2.120-nagios服务器端 check_x ...
- Solaris与Windows Active Directory集成
通过Solaris与Active Directory的集成,Solaris可以使用Windows 2003 R2/ 2008 Active Directory来进行用户登录验证.以下是简要配置过程. ...