詢問區間內出現次數最多的數出現的次數

2021-08-25 17:19:23 字數 1287 閱讀 7568

poj 3368 frequent values(rmq)

題意:

給出乙個非降序排列的整數陣列a1,a2,...an,你的任務是對於一系列詢問(i, j),回答ai,ai+1,...aj中出現最多次數的值所出現的次數?

分析:劉汝佳:訓練指南p198

1.      本題主要思想是把輸入序列分成一段段由相同值構成的序列,然後對於每個查詢[l,r]看他覆蓋了那些段,只要再這些連續的段範圍內找出現次數的最大值即可,即rmq問題

2.      由於a[n]是公升序排列的,所以給a陣列遊程編碼為(v,num)其中v是a[i]的值,num是v這個相同的值出現的次數。用rmq維護乙個陣列d[j]=num,表示從左到右出現的所有值中第j個出現的值連續出現了num次。

3.      然後給每乙個a[i]建立num[i], left[num[i]] ,right[num[i]],分別表示:

a[i]的值在所有出現的值中是在第num[i]個出現的(num[i]就是分析1中a[i]值的出現次數在rmq中的編號j)

與a[i]值相同的連續值最左邊的那個是位於left[num[i]]位置,最右邊的那個是位於right[num[i]]位置,並且。

4.      對於乙個查詢[l,r],首先求出l,和r分別屬於個num,如果num[l]==num[r],那麼ans=r-l+1

否則,與l相同的值出現了

right[num[l]]-l+1次,與r相同的值出現了

r-left[num[r]]+1次,在l與r中間(如果有的話)的值最多出現了

getmax(num[l]+1,num[r]-1)次

5.      最終結果就是

max(right[num[l]]-l+1 ,r-left[num[r]]+1 ,getmax(num[l]+1,num[r]-1))

#include#include#includeusing namespace std;

const int maxn =200000+1000;

int dmax[maxn][20];

int a[maxn];

int left[maxn],right[maxn],num[maxn];

int d[maxn];//d[i]=8表第i個不同的值出現了8次

void initmax(int n,int d)}}

return 0;

}

出現次數最多的整數

問題描述 編寫乙個程式,讀入一組整數,這組整數是按照從小到大的順序排列的,它們的個數n也是由使用者輸入的,最多不會超過20。然後程式將對這個陣列進行統計,把出現次數最多的那個陣列元素值列印出來。如果有兩個元素值出現的次數相同,即並列第一,那麼只列印比較小的那個值。輸入格式 第一行是乙個整數n,n 2...

出現次數最多的整數

問題描述 編寫乙個程式,讀入一組整數,這組整數是按照從小到大的順序排列的,它們的個數n也是由使用者輸入的,最多不會超過20。然後程式將對這個陣列進行統計,把出現次數最多的那個陣列元素值列印出來。如果有兩個元素值出現的次數相同,即並列第一,那麼只列印比較小的那個值。輸入格式 第一行是乙個整數n,n 2...

出現次數最多的數

出現次數最多的數 問題描述 給定n個正整數,找出它們中出現次數最多的數。如果這樣的數有多個,請輸出其中最小的乙個。輸入格式 輸入的第一行只有乙個正整數n 1 n 1000 表示數字的個數。輸入的第二行有n個整數s1,s2,sn 1 si 10000,1 i n 相鄰的數用空格分隔。輸出格式 輸出這n...