題意:
給乙個非降序排列的整數陣列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]個相同的數。這樣的話每次查詢(l, r)就只要計算(right[l]-l+1),(r-left[r]+1)和rmq(num[l]+1, num[r]-1)這三個值的最大值就可以了。其中,rmq是對coun陣列進行取件查詢的結果。
特殊的,如果l和r在同乙個區間內的話,那麼結果就是(r-l+1)
const
int n=1e5+9;
struct rmq
int query(int l,int r)
};int a[n],num[n],l[n],r[n];
int n,q,l,r,ans;
rmq rmq;
int main()
start=i;}}
rmq.init(cnt);
while(q--)
printf("%d\n",ans);}}
return
0;}
UVA 11235 遊程編碼 ST演算法
題目大意 給定乙個公升序序列,有q次詢問,每次詢問 l,r 出現最多的值的次數。解題思路 非常麻煩的題目。儘管一眼就能看出來是個rmq。關鍵在於如何轉化為rmq。首先對序列進行遊程編碼,壓縮成pos段。編碼的同時用num i 記錄當前點在段中編號,lb i 記錄在當前段的左邊界,更新code pos...
UVA 11235 線段樹加區間合併
記錄每個位置的左邊界和又邊界,然後建起線段樹如果左區間的尾部和右區間的頭部是一樣的數值,可能這個尾部這個數在裡面出現次數會變成最大 所以要更新一下這個這段的最大出現次數 題目鏈結 include include include include define inf 0x3f3f3f3f define...
RMQ 需要轉化一下 uva11235
思路 因為元素是連續的,所以可以把相同的元素劃分成一段,用value i 和count i 分別表示第i段的數值和出現的次數,num p left p right p 分別表示p位置所在的段和左右端點的編號,查詢的時候只需要比較right r r 1,l left l 1和第num l 1到num ...