定義乙個區間的值為其眾數出現的次數。
現給出n個數,求將所有區間的值排序後,第k大的值為多少。
input第一行兩個數n和k(1<=n<=100000,k<=n*(n-1)/2)
第二行n個數,0<=每個數<2^31output乙個數表示答案。sample input
4 2sample output1 2 3 2
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啊 主要是一開始思路死在乙個地方了,在考慮判斷是否合法 但其實我們並不需要在意我們找到這個數是不是眾數 因為...