頻繁出現的數值

2021-07-09 10:20:52 字數 1333 閱讀 4822

題目大意:

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

分析:由於數列是非降序的,所以所有相等的數都會聚集在一起。這樣我們就可以把整個陣列進行編碼。如-1,1,1,2,2,2,4就可以編碼成

(-1,1),(1,2),(2,3),(4,1)
表示(a,b)陣列中的a連續出現了b次。

用到以下的資料結構

num[i]表示原陣列下表是i的數在編碼後的第num[i]段。
left[i],right[i]表示第i段的左邊界和右邊界
用coun[i]表示第i段有conu[i]個相同的數。
比如輸入    2 2 3 3 3 4 5 6 6
num陣列為   1 1 2 2 2 3 4  5 5
left陣列為  0 2 5 6 7
right陣列為 1 4 5 6 8
count陣列為 2 3 1 1 2
其中最重要的是count陣列,因為我們要找出現最頻繁的數字,我們已經知道count陣列的元素了,只要在遞推矩陣裡遞推最大值就可以了。
所以遞推矩陣第一列,填寫的不再是輸入的數字,而是count陣列的內容,遞推到右上角時候,右上角的值就是我們要求的答案。
這樣的話每次查詢(l, r)就只要計算(right[l]-l+1),(r-left[r]+1)和rmq(num[l]+1, num[r]-1)這三個值的最大值就可以了。

其中,rmq是對coun陣列進行取件查詢的結果。

特殊的,如果l和r在同乙個區間內的話,那麼結果就是(r-l+1)

#include #include #include using namespace std;

#define maxsize 100010

int num,index=0,temp,total=0;

int pos[maxsize];

int leftpos[maxsize],rightpos[maxsize],counts[maxsize];

int dp[maxsize][1000];

void initrmq(int n)

leftpos[index]=i;

temp=num;

total++;

}else if(num==temp)

if(i==n-1)

pos[i]=index+1;

}initrmq(n);

for(i=0;i>l>>r;

cout<

UVa 11235 頻繁出現的數值(RMQ)

題意 給乙個非降序排列的整數陣列a,你的任務是對於一系列詢問 i,j 回答ai,ai 1 aj中次數出現最多的值所出現的次數。分析 由於數列是非降序的,所以所有相等的數都會聚集在一起。這樣我們就可以把整個陣列進行編碼。如 1,1,1,2,2,2,4就可以編碼成 1,1 1,2 2,3 4,1 表示 ...

c 找出序列中出現得最頻繁的值

題目要求 編寫乙個函式模板,接受表示未知型別迭代器的一對值,找出在序列中出現的最頻繁的值。自己寫的 沒有考慮存在出現次數最多且相同的情況,也就是預設輸出第一次最多的數值。include include include using namespace std 找到容器中出現次數最多的值 templat...

C 查詢文字中出現最頻繁的10個單詞

include include include include include include include using namespace std typedef struct wordwords class node 析構函式 node 返回這個節點的內容 char content 設定這個節...