題目大意:給乙個非降序排列的整數陣列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 設定這個節...