1686 第k大區間
基準時間限制:1 秒 空間限制:131072 kb 分值: 40 難度:4級演算法題
定義乙個區間的值為其眾數出現的次數。
現給出n個數,求將所有區間的值排序後,第k大的值為多少。
input
第一行兩個數n和k(1<=n<=100000,k<=n*(n-1)/2)output第二行n個數,0<=每個數<2^31
乙個數表示答案。input示例
4 2output示例1 2 3 2
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 # includeview code12 # 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 }
(二分,尺取,離散化)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...