高等理论计算机科学 LCA+树上差分(树上的相交路径条数)Hihocoder-1167

题目链接:Hihocoder-1167

主要思路:

多画几棵树可以看出两条路径相交时只有一条路径的LCA落在另一条路径上,故你可以求每个LCA落在几条路径上(若两条路径LCA相同,这时候就会算两遍,故将LCA从路径上剔除,特判即可)。

求每个LCA落在几条路径上就可以用树上差分。

AC代码:

#include
#include
#include
#define lowbit(x) x&-x
#define M 100005
using namespace std;
struct E {
	int to,nx;
} edge[M<<1];
int tot,head[M];
void Addedge(int a,int b) {
	edge[++tot].to=b;
	edge[tot].nx=head[a];
	head[a]=tot;
}
struct Path {
	int from,to;
	bool operator <(const Path &x)const {
		return ton=n;
		this->m=m;
		dfs(1);
		top[1]=1;
		redfs(1);
		for(int i=1; i<=m; i++) {
			sum[way[i].from]++;//差分 
			sum[way[i].to]++;
			int x=LCA(way[i].from,way[i].to);
			sum[x]-=2;//不把LCA算上去 
			cnt[x]++;
		}
		ansdfs(1);
		printf("%lld\n",ans);
	}
} P100;
int main() {
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1; iway[i].to)swap(way[i].from,way[i].to);
	}
	P100.solve(n,m);
}

 

你可能感兴趣的:(LCA)