题目大意:
现在有一个长度为n的序列,给出m个操作,每次操作都是将第p个位置处的数值替换为q,问每次操作后以第一个元素为起点的LIS的长度是多少。
解题思路:
利用线段树维护区间最大值 && 以区间左端点为起点的LIS的长度,这样答案就是以1为起点的LIS长度。对于每次查询只要替换对应位置上的值和更新树就好了,查询完后记得改回来。
有几点比较巧妙的地方稍微写一下:
- 区间的LIS长度 = 左子树的LIS长度 + 以左子树最大值为起点的右子树的LIS长度。
- 计算以某个值为起点的LIS长度时,继续比较这个值和此区间的左子树的最大值,大于等于就查询右子树,否则就返回继续查询左子树的LIS长度 + 用左子树的最大值查询右子树的LIS长度(写的很乱,直接看代码的
calc
函数和pushup
函数好了)。
Mycode:
1 |
|