51 nod 1686 第K大區間(二分 尺取)

2021-08-18 07:59:40 字數 896 閱讀 4979

定義乙個區間的值為其眾數出現的次數

現給出n個數,求將所有區間的值排序後,第k大的值為多少。

input第一行兩個數n和k(1<=n<=100000,k<=n*(n-1)/2) 

第二行n個數,0<=每個數<2^31output乙個數表示答案。sample input

4 2

1 2 3 2

sample output
2

解 :我們要注意的是  定義乙個區間的值為其眾數出現的

次數

我們可以先二分答案 ,看我們二分出來的這個答案是否滿足比這個數大的個數小於k,我們怎麼判斷就用到了尺取;

因為n較小而n個數的值較大 我們可以先把他離散化 

#include#include#include#include#include#include#include#includeusing namespace std;

#define inf 0x3f3f3f3f

#define ll long long

ll a[1000100];//輸入

ll c[1000100];//和輸入值一樣,不過在輸入值去重後,用它來進行離散化

ll b[1000100];//離散化後的值

ll num[1000100];//num[i]代表選取的一段中i出現的次數

int n,k;

int kk(int x)//尺取}}

if(en>=k) return 0; //大於x的個數大於等於k個,說明列舉的答案不是第k大

return 1; //說明列舉答案小於或等於第k大

}int main()

{ scanf("%d%d",&n,&k);

for(int i=0;i

51Nod 1686 第K大區間

題意 中文題,定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。離散化二分答案加尺取判斷 include include includeusing namespace std const int maxn 100006 typedef long long l...

51nod 1686 第K大區間

1686 第k大區間 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。input 第一行兩個數n和k 1 n 100000,k n n 1 2 第二行n個數,0 每個數 2...

51 nod1686 第K大區間

定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。很簡單的乙個題啊。然後我想了很久,是不是藥丸了啊。才四級題就差點想不出來了 明顯地二分乙個答案mid啊 主要是一開始思路死在乙個地方了,在考慮判斷是否合法 但其實我們並不需要在意我們找到這個數是不是眾數 因為...