51nod 1686 第K大區間

2021-08-18 07:26:48 字數 770 閱讀 3708

題目鏈結

這道題是真的好

思想很好

思路其實也不是很難

但是也不容易理解

首先,這道題運用了二分

因為答案一定是1~n(區間眾數最多n個,最少1個)

那麼從1~n二分mid,二分後判斷區間值比mid大的區間有幾個

如果大於k說明mid取的小了,應該取大一點,反之取小一點,最後找到答案

那麼如何判斷區間值比mid大的區間有幾個

遍歷一下所有數,如果有的數的個數等於mid,那麼這個區間的右端點往右移的區間的區間值肯定都比它大

然後左邊邊向右移,如果區間值還不變,那麼可以再讓 l 往右移,儲存一下區間個數

#includeusing namespace std;

int n;

long long k;

int a[100005];

int b[100005];

int num[100005];

bool check(int x)//區間值為大於等於x的個數

s++;//指向區間的下乙個數}}

if(res>=k)//如果區間值大於等於x的個數大於k,說明實際值要比x大

}return false;

}bool cmp(int a,int b)

else

}if(check(e))//特殊判斷一下最後乙個點

s=e;

printf("%d\n",s);

}return 0;

}

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啊 主要是一開始思路死在乙個地方了,在考慮判斷是否合法 但其實我們並不需要在意我們找到這個數是不是眾數 因為...