SSOJ2594公交线路统计
2798+
作者:crxis 发布:2017-12-07 分类:差分
题目大意:n个城市有n-1条道路相连(一棵树),有m条公交线路(都是两个城市之间的最短路),请问每条道路上分别有多少条公交线路?
输入
第一行:2个整数n和m
第二行:n-1个整数表示城市编号,第i个整数ai表示城市i+1到ai有一条道路,其中ai父亲结点,i+1是儿子结点
接下来m行,每行2个整数表示城市a和b有一条公交线路
第二行:n-1个整数表示城市编号,第i个整数ai表示城市i+1到ai有一条道路,其中ai父亲结点,i+1是儿子结点
接下来m行,每行2个整数表示城市a和b有一条公交线路
输出
输出n-1行,每行3个整数,第i行表示i+1到他父亲结点的道路有多少条公交线路
样例输入
7 3
1 1 2 3 3 3
4 5
5 7
1 6
样例输出
2 1 1
3 1 2
4 2 1
5 3 2
6 3 1
7 3 1
提示
n不超过10万,m不超过50万
解题思路
差分可以让区间修改转化成单点修改,如城市a和城市b有一条公交线路,a和b的公共祖先的c,那么我们可以在点a标记+1(根结点到a所有路径都+1),在点c标记-1(根结点到c所有路径都-1),这样就相当于a到c之间的路径全部+1,因为c以上的由于+1和-1抵消,并没有增加公交线路(b到c之间也是如此)。打完标记后,自下而上把儿子结点的标记累加到父亲结点,这样每个结点到其父亲结点道路上的公交线路就统计出来了。
程序实现
树链剖分求LCA代码: