给定索引i,j(j> = i)如何在子阵列(i,j)处找到A [j]的频率?

时间:2014-01-14 09:35:41

标签: c++ algorithm cumulative-frequency

给定一个整数数组A,我试图找出给定位置j,从A中每个i = 0到i = j发生A [j]的次数。我已经设计了如下的解决方案< / p>

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]]; 
}

我可以在登录时间内回答每个查询。但是这个程序使用了太多内存。有没有办法用更少的内存来做呢?

要获得更多说明,您可以看到我正在尝试解决的问题http://codeforces.com/contest/190/problem/D

2 个答案:

答案 0 :(得分:3)

创建与B大小相同的数组A和地图CjB[j]中的每个A[j]都会跟踪j之前C的出现次数。在map<int,int> C; int B[n]; // zeros for(int i=0;i<n;++i) { cin >> A[i]; int prev = C[A[i]]; // let me assume it gives -1 if no element if (pref == -1) // this is the fist occurrence of B[i] B[i] = 1; else // if not the first, then add previous occurrences B[i] = B[prev] + 1 C[A[i]] = i; // keep track where the last info about A[j] is } 中跟踪给定元素的最后一次出现。然后你在恒定时间内回答查询,它只需要O(n)内存。

抱歉我的伪C ++。

{{1}}

答案 1 :(得分:1)

没有给这个太多的时间,但也许不是使用地图将所有的位置,使用一个列表,您为每个元素放置该元素的计数变化的点,对此:

struct count_info
{
    int index;
    int count;
    count_info* next;
};
...
std::map<int, count_info*> data;

,然后在该队列中查找正确的位置。你仍然需要一张地图,但是在你的下面你只会有一个这些指针的列表,在查询时你会在地图中查找A [i],然后在i&gt;中查看列表。索引&amp;&amp;下一个&amp;&amp;我&lt;下一步 - &GT;指数。当然,如果必须使用logn,那么这会失败,因为列表查找最差是n。