线段树
245. 你能回答这些问题吗
原题链接
查询区间最大连续和,因此除了区间端点以外,维护四个性质:
区间最大连续子段和:tsum
区间和:sum
靠左:lsum
靠右:rsum
u.sum = l.sum+r.sum;
u.lsum = max(l.lsum,l.sum+r.lsum);
u.rsum = max(r.rsum,r.sum_l.rsum);
u.tmax = max(max(l.tmax,r.tmax),l.rmax+r.lmax);
246. 区间最大公约数
原题链接
由gcd(a1,a2,a3....an)=gcd(a1,a2-a1,a3-a2......an-an-1),构造差分数组b[i]=a[i]-a[i-1],线段树维护序列b的区间最大公约数
1.对于“Q,l,r”
//1.先查找左节点
left=query(1,1,l);
//2.设置右节后再查询右节点
right={0,0,0,0};
right=query(1,l+1,r)
2.对于修改,按照差分的思想
#由于维护的是前缀和,因此当修改叶子节点时
ll b=tr[u].sum+v;
tr[u]={x,x,b,b};
#修改区间时
modify(1,l,d);
if(r+1<=n) modify(1,r+1,-d);