给定索引 i,j(j>=i) 如何在子数组(i,j)上找到 A[j] 的频率?
Given index i,j(j>=i) How to find the frequency of a A[j] at a subarray(i,j)?
给定一个整数数组A,我试图找出在给定位置j,A[j]从A中每个i=0到i=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]];
}
比我可以在登录时间内回答每个查询。但是此过程使用太多内存。有什么方法可以使用更少的内存来做到这一点?
有关更多说明,您可以看到我正在尝试解决的问题 http://codeforces.com/contest/190/problem/D
创建一个与 A
大小相同的数组B
和一个映射C
。对于B[j]
中的每个j
,请跟踪j
之前A[j]
的出现次数。在C
跟踪给定元素的最后一次出现。然后你在恒定的时间内回答查询,它只需要 O(n) 内存。
对不起我的伪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
}
没有给这个太多时间,但也许不是使用地图将所有位置,而是使用一个列表,为每个元素放置该元素计数变化的点,朝这个方向:
struct count_info
{
int index;
int count;
count_info* next;
};
...
std::map<int, count_info*> data;
,然后在该队列中查找正确的位置。你仍然需要一个地图,但是在下面你只有一个这些指针的列表,在查询时,你在地图中查找A[i],然后在我>索引&&next &&i
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 使用 for 循环 c++ 确定与数组中特定频率匹配的值的函数
- 如何使用二维数组来计算和存储来自其他数组的值的频率
- 我如何在数组中找到特定值的频率
- 给定索引 i,j(j>=i) 如何在子数组(i,j)上找到 A[j] 的频率?
- 是否可以计算出 std::vector 扩展其数组大小的频率
- 获取给定数字集中具有相同数字频率的组数
- 检查数组值连续出现的频率
- 计算 C 数组中三元组的频率以进行索引
- 计数数组中元素的频率
- 给定一个范围,我必须计算数组中数字的频率.给定的解决方案是否有效