题意:
给出一棵树,树上的每个点有权值,m次询问从u到v两点路径上最大的LCIS值是多少
分析:
熟练剖分解决两点路径的移动问题
关键还是在于线段树的区间合并和爬树时的区间方向问题
我是这么处理这个过程的,对于每个区间,记录每个区间的 Lval(左端点值),Rva(右端点值),LL(以左端点为起点的下降最大LCIS值),LR(以左端点为起点的上升最大LCIS值),RL(同上),RR(同上),Len(区间内从左到右的最长上升LCIS值),Ren(从右到左最长上升LCIS值),那么在区间合并时去维护这几个值就可以了,在爬树过程中直接进行合并操作,最终判断方向我设置了一个flag表明从哪个端点爬到哪个端点,剩下的就是一些细节问题了,总之不是很好处理,稍不细心就容易写出错。
#include<cstring>
#include<string>
#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstdlib>
#include<cmath>
#include<vector>
//#pragma comment(linker, "/STACK:1024000000,1024000000");
using namespace std;
#define INF 0x3f3f3f3f
#d