Description
Input
Output
共m行,每行一个整数表示询问的答案
Sample Input
10
5 4 8 9 1 6 3 2 7 10
5 6 3 4 1 2 10 7 8 9
5
3 7 2 4 1
3 10 3 7 4
6 8 1 3 1
9 10 2 2 1
2 3 2 2 1
Sample Output
2
8
2
9
3
Solution
这题一看到题就有一种很显然的做法,简单来说就是分块套分块套分块,然而编程复杂度太高
稍微分析一下就会发现,如果以原顺序为一维,第一关键字为二维,第二关键字为权值,那么那些点都可以抽象成一个二维平面内的点,询问就是询问一个矩形内权值第几的点的权值
那么显然可以用树套树来做,然而我不会
所以可以用一种更简单的方法:整体二分
这是我第一次打整体二分,所以可能有点难看
思想就是,每次二分出的mid,然后对每个询问判断这个询问的答案比mid大还是比mid小,分为两部分并继续二分
那么在这题中,如果将询问和点都按照第一维来排序,依次操作,如果是点就加入数据结构中,查询就用关键字直接查询。
那么数据结构中有的就是第一维被压扁,只有第二维的值了
在查询矩形时,就可以变为查询区间,矩形的左右两个相减,就可以只需要一个一维的数据结构,查询点数,用树状数组就可以维护了
可能说不清楚,自行看看标吧
Code
#include<cstdio>
#include<algorithm>
#include<cstring>
#