给定一棵树
1:求链上gcd
2:给一个路径共同加一个给定数
待区间修改的区间gcd问题,可以用差分后线段树做。就是 gcd(起始位置原值,之后的差分数组中gcd);
对于树上,只需要把树剖成链,对于询问和操作,单独处理每一个小区间就好,做法和序列上一样。
区间修改就是,在差分数组中 head位置加上val,tail+1位置减去val
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=50005;inline int read()
{int ans,f=1;char ch;while ((ch=getchar())<'0'||ch>'9') if (ch=='-') f=-1;ans=ch-'0';while ((ch=getchar())>='0'&&ch<='9') ans=ans*10+ch-'0';return ans*f;
}int n,m;
int val[N];int head[N],to[N*2],pre[N*2],tot;
void addedge(int u,int v)
{to[++tot]=v;pre[tot]=head[u];head[u]=tot;
}int dep[