定義乙個區間的值為其眾數出現的次數。
現給出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取的小了,應該取大一點,反之取小一點,最後找到答案 那麼如何判斷區間...