給定一個整數數組A,我試圖找出在給定的位置j,從A的每一個i = 0到i = j出現了多少次A [j]。我已經設計了一個如下的解決方案,如下所示:給定索引i,j(j> = i)如何在子陣列(i,j)上找到A [j]的頻率?
map<int,int> CF[400005];
for(int i=0;i<n;++i)
{
cin>>A[i];
if(i!=0)
CF[i-1] = CF[i];
++CF[i][A[i]];
}
比我可以在logn時間回答每個查詢。但是這個過程使用了太多的內存。有沒有辦法使用更少的內存來做到這一點?
更多的澄清,你可以看到這個問題我想解決http://codeforces.com/contest/190/problem/D
也許我錯過了一些東西,但是如果有關元素的最後信息超出了範圍0 ... j,那麼查詢將如何執行?這對於在0 ... n範圍內進行查找來說看起來非常完美,或者我可能嚴重缺少某些東西? –
好,問題是要找出「在A中每個i = 0到i = j發生A [j]多少次」。所以關於0 ... j的信息就足夠了。對於更復雜的查詢,我會建議排名樹的映射(映射鍵:A元素值;樹鍵:元素的位置)。然後我們有O(log n)爲每個查詢和O(n)內存爲整個結構。 –