题目传送门
视频讲解
一、题目大意
给一个序列, 两种操作, 一种是将\([l, r]\)里所有数升序排列, 一种是降序排列。
所有操作完了之后, 问你\(a[k]\)等于多少。
二、解题过程
因为最后只询问一个位置, 所以我们二分这个位置的值。 将所有大于等于它的值赋为\(1\), 小于的赋为\(0\). 然后现在整个序列只有\(01\),更改什么的线段树就很好搞。
如果\(a[k]\)最后为\(1\), 那么我们增加\(l\), 否则减少\(r\)。
那么为什么可以这样呢。
因为二分\(mid\)的时候, 将等于\(mid\)的也赋为了\(1\), 所以如果\(a[k]\)是\(0\)的话,代表\(mid\)比答案大, 所以减少\(r\)。
那么\(a[k]\)为\(1\)的时候有两种, 一种是\(mid\)刚好是答案, 另一种是\(mid\)比答案小, 所以我们增大\(l\)逼近答案。
三、实现代码
#include
#include
#include
#include
#include