题目:
题解:
将元素组的差分数组存入线段树
区间加操作:
将元素组的差分数组存入线段树,在每一次对区间[ l, r ]加操作时等价于在线段树中的两次单点修改操作:对d[l]+c和d[r+1]-c。
求区间最大公约数:
这里用了一个数学知识两个数的最大公约数和两个数的一个组合是一样的。
因为线段树的每个节点代表的是原数组中对应因为和前一位的一个组合,所以在直接查询一个区间[ l , r ]的最大公约数时真正返回的是 元素组中区间[ l-1 , r ]的最大公约数,所以线段树还要存一个前缀和表示线段树中当前这位在元素中中是多少,这样在查询区间[ l , r ]的最大公约数时,就可以准确地表示为gcd( sum(l) , [ l+1 , r ] ) .
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=500010;
#define int long long
int n,m;
int w[N];
struct Node{
int l,r;
int sum,d;
}tr[N*4];
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
void pushup(Node& u,Node& l,Node& r){
u.sum&#