題意:給出陣列,區間的值為其重數(這個重數是指區間內的重數,不是整個陣列的重數),求解第k大小的區間值(重數)
題解:思路:二分+尺取法
由上知:
重數的範圍為 1~~100000
重數值大的區間一定包括重數值小的區間
因此找到有大於等於k個區間值為mid就是答案了
注意:有可能第k大的值和第k-1個 或者 第 k-2個值相等
例如:陣列 1 2 3 4 4 4 4 4
步驟:預處理:
先去重(注意 用去重函式得先排序),然後計算原陣列中每個數在去重後的陣列裡面的位置
1···二分重數範圍得到mid
2···求解重數為mid的區間有多少個
3···然後就是一般性的二分處理
#include#include#includeusing namespace std;
#define maxn 100010
#define ll long long
ll n,k;
ll a[maxn],b[maxn],num[maxn];
int cmp(const void *x,const void *y)
ll deal(ll number)
printf("%lld\n",ans);
}return 0;
}
51nod 1686 第K大區間 二分 尺取
題意 定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。思路 答案具有單調性,所以可以二分,關鍵是check的時候怎麼統計有多少區間滿足 mid,我們可以知道假如區間 l,r 滿足,那麼左右擴大這個區間都是滿足的,所以可以尺取,列舉右端點,找到最大的符合條件...
51 nod 1686 第K大區間(二分 尺取)
定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。input第一行兩個數n和k 1 n 100000,k n n 1 2 第二行n個數,0 每個數 2 31output乙個數表示答案。sample input4 2 1 2 3 2sample output2...
51Nod 1686 第K大區間(尺取法 想法題)
給定 n n 個數 a1 a2.an role presentation style position relative a1,a2.ana 1,a2 a n,求將所有區間眾數出現次數排序後,第 k k 大的值是多少。1 n 100000 role presentation style positi...