題目鏈結
這道題是真的好
思想很好
思路其實也不是很難
但是也不容易理解
首先,這道題運用了二分
因為答案一定是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啊 主要是一開始思路死在乙個地方了,在考慮判斷是否合法 但其實我們並不需要在意我們找到這個數是不是眾數 因為...