1686 第K大區間 尺取 二分

2022-04-11 02:20:44 字數 2004 閱讀 4157

1686 第k大區間

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 難度:4級演算法題

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

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

input

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

第二行n個數,0<=每個數<2^31

output

乙個數表示答案。
input示例

4 2

1 2 3 2

output示例

2

//首先,考慮區間的值的性質,如果區間的值為 x ,那麼,區間無論怎麼左右擴充套件,區間的值必然大於等於 x 。

那麼,計算區間的值大於等於 x ,可以用尺取在 o(n) 時間算出,顯然,這是有單調性的,二分即可

1 # include 2 # include 3 # include 4 # include 5 # include 6 # include 7 # include 8 # include 9 # include 10 # include 11 # include 

12 # include 13 # include 14 # pragma comment(linker,"

/stack:102400000,102400000")

15using

namespace

std;

16 # define ll long

long

17# define pr pair

18# define mkp make_pair

19 # define lowbit(x) ((x)&(-x))

20 # define pi acos(-1.0

)21 # define inf 0x3f3f3f3f3f3f3f3f

22 # define eps 1e-8

23 # define mod 1000000007

2425 inline int

scan()

28while(ch>='

0'&&ch<='9')

29return x*f;30}

31 inline void out(int

a) 33

if(a>=10) out(a/10

);34 putchar(a%10+'0'

);35

}36 # define mx 100005

37/*

************************

*/38

39int

n,k;

40int

a[mx];

41int

b[mx];

42int

num[mx];

4344

bool check(int

x)45

58else

5967}68

}69if (tot>=k) return1;

70return0;

71}7273

intmain()

7481 sort(b+1,b+1+n);

82for (int i=1;i<=n;i++)

83 a[i] = lower_bound(b+1,b+1+n,a[i])-b;

8485

int l=1, r=n;

86int

ans;

87while (l<=r)

8893 printf("

%d\n

",ans);

94return0;

95 }

view code

(二分,尺取,離散化)1686 第K大區間

1 秒131,072 kb 40 分 4 級題 定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。收起 第一行兩個數n和k 1 n 100000,k n n 1 2 第二行n個數,0 每個數 2 31乙個數表示答案。4 2 1 2 3 22題解 二分 尺取 ...

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...