当前位置: 代码迷 >> 综合 >> codechef DGCD (树链剖分)
  详细解决方案

codechef DGCD (树链剖分)

热度:11   发布时间:2024-01-04 12:48:20.0

给定一棵树

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[