【题意分析】
首先,暴力sort有30pts…
全排列是一个特别好的性质,我们想想有没有特别的做法。
由于数字保证不重复,对于x,把大于等于x的数全部变为1,把小于x的数全部变成0。
那么我们可以发现:对于要排序的区间[l,r],如果是升序,那么区间前面肯定是若干个零,后面全是1,如果是降序,那么区间前面全都是1, 后面全都是0。
然后这样操作之后我们看看要求的q位置上数字是否为1,就可以初步确定排完后这个位置上的数比x大还是比x小。(1是比x大,0是比x小)
想到什么?二分这个x,二分到最后无法再放缩时,说明我们已经找到了答案。
现在唯一的问题就是排序,由于序列全是0和1,我们可以考虑用线段树维护:利用线段树可以求出每段区间有几个0与几个1(区间求和就可以算出几个1),排序时,只要一段一段地赋值即可。
具体操作:对于区间 [ l , r ] [l,r] [l,r]有res个1,那么如果是降序, [ l , l + r e s − 1 ] [l,l+res-1] [l,l+res−1]为1, [ l + r e s , r ] [l+res,r] [l+res,r]为0.
如果是升序, [ l , r − r e s ] [l,r-res] [l,r−res]为0, [ r − r e s + 1 , r ] [r-res+1,r] [r−res+1,r]为1
Code :
#include <iostream>
#include <cstdio>
#