给定一个整数数组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)内存为整个结构。 –