所求的一定是a陣列中的原素,這點毋庸置疑,所以在a陣列中任意選則其中的乙個數x,若a的所有長度不小於k的連續子串行中第k大數不小於x的子串行一共有ans個,那麼x在所有第k大元素組成的數列中至少是第ans大數;(因為ans+=n-r,因為之前的x已經是第k大了,所以加上後面的元素,如果比他小,則沒有影響,如果比他大,他就是第k大中的第二大,依次類推,知道加到n-r,此
時x就能保證至少是第ans大,用此時的ans跟m做比較進行二分查詢)
感覺他大體的思路是這樣,因為要找到第k大中的第m大,直接找肯定不可能的,而k,m又都是已知的,所以倒著看就是在陣列中取出乙個數看他是否能作為第k大中的第m大,為了快速選取,則進行二分查詢操作,判斷x是否能作為第k大,如果能,後面直接就不用考慮了,加上去至少ans大,所以就能比較出答案。確實有些燒腦。
#include#include#includeusing namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn];
int n,k;
typedef long long ll;
ll m;
ll calc(int x)else
}return ans;
}int main()
printf("%d\n",ans);
}return 0;
}
hdu 6231 二分 尺取
題意 給你乙個n個數的陣列,把這個陣列中長度大於等於k的區間中第k大的數取出來組成乙個新陣列,問你這個新陣列第m大是多少。可能有的人和我一樣沒去分開第k大和第k小的關係,比如陣列 1,2,3,4,5 第2大就是4,第2小就是2.思路 我們可以用尺取算出第k大大於等於x的區間個數有多少個。當我們了解這...
尺取 二分查詢
尺取法 這是一種比較有趣的方法,想吃子一樣去解決問題。現在我只是知道了可以用陣列來模擬 尺子 加油學習!方法是 陣列模擬 二分查詢 說一 下資料的意思,10個數,從中找出和為15的最短子串。10 5 1 3 5 10 7 4 9 2 8 15 include using namespace std ...
K th Number(尺取 二分)
傳送門 釐清題意很重要,給你乙個序列a,再給出k,m,將a中每個區間的第k大元素放入b序列,問b序列的第m大元素是多少。思路 可以想到一段序列的所有區間數是固定的,每個區間的第k大也都是固定的。假設b序列的第m大元素是x,則可知大於等於x的數有m個,即對於a序列的所有區間第k大,大於x的有m個。這裡...