【题解】Range Sorting (Hard Version) 思路记录
version1.0
考虑数组中的最小值:
- 此时最小值一定要一道最左边去,不如整体排序
综合结果:排序[1,pos[1]] - 考虑次小值:
如果 pos[2]<pos[1] 下一个;
否则 排序[2,pos[2]]
总结下来看,单调栈。每次取右边的最小值排序。
每个点有一个下标和权值 -> 笛卡尔树
询问就相当于所有右链的权值之和
考虑一个点什么时候会成为右链,当且仅当 l>这棵树的下标最小值 r<这棵树下标最大值
结束!
version 2.0
考虑数组中的最小值:
- 此时最小值一定要一道最左边去,不如整体排序
综合结果:排序[1,pos[1]],总共花费 pos[1]-1; - 考虑次小值:
如果 pos[2]<pos[1] 下一个;
否则 排序[pos[1]+1,pos[2]],再排序[1,pos[1]+1],总共花费 pos[2]-1;
总结下来看,单调栈。每次取右边的最小值排序。
每个点有一个下标和权值 -> 笛卡尔树
询问就相当于最右边的点权值-1
发现只要这个点为答案,当且仅当它的父亲都是原父亲(如果有)的右儿子。
结束!