51 nod1686 第K大區間

2021-08-15 10:19:43 字數 1157 閱讀 1960

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

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

很簡單的乙個題啊。。然後我想了很久,是不是藥丸了啊。。

才四級題就差點想不出來了

明顯地二分乙個答案mid啊

主要是一開始思路死在乙個地方了,在考慮判斷是否合法

但其實我們並不需要在意我們找到這個數是不是眾數

因為只要乙個區間裡面有至少乙個數出現的次數是大於mid,那麼這個區間的眾數出現次數至少是mid的,那麼他就合法了

於是我們可以列舉乙個右端點

找乙個最近的乙個左端點,使得這個區間至少有乙個數出現次數大於mid

這個的話對於每個數記錄乙個值,和他一樣的數在他mid個之前的出現在**就可以了

複雜度o(n

logn

) o(n

logn

)code:

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const ll n=100005;

ll n,k;

ll a[n];

ll b[n];

void lsh ()

else

if (b[mid]>a[u]) r=mid-1;

else l=mid+1;}}

}ll g[n];//這個數上x個在**

vector

f[n];//每個數出現的位置

ll l[n];

ll get (ll x)//區間眾數大於等於x的有多少個

ll l=0;

ll lalal=0;

for (ll r=1;r<=n;r++)

return lalal;

}int main()

lsh();

ll l=1,r=n,ans;

while (l<=r)

else r=mid-1;

}printf("%lld\n",ans);

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

51nod 1686 第K大區間

題目鏈結 這道題是真的好 思想很好 思路其實也不是很難 但是也不容易理解 首先,這道題運用了二分 因為答案一定是1 n 區間眾數最多n個,最少1個 那麼從1 n二分mid,二分後判斷區間值比mid大的區間有幾個 如果大於k說明mid取的小了,應該取大一點,反之取小一點,最後找到答案 那麼如何判斷區間...