数组中的"Maximum Sum mod M"范围:求和和计数
"Maximum Sum mod M" ranges in an array: sum and count
>问题
给定数组A = a0,a1,...an,大小最大为 N ≤ 10^5,0 ≤ ai≤ 10^9。
和数字0
任务是找到最大∑(k=i, j) a k % M = (a i + a i+1 + a(i+2) + ⋯ + a(j−1) + a(j)) % M,以及有多少个不同的范围(i,j)得到这个总和。
复杂度必须小于O(N^2),后者太慢。
例
N= 3,M= 5
A= {2, 4, 3}
最大总和 mod M为4,有 2 个范围,分别是0到2和1
我的尝试
让我们定义s[j] = (a0+ a1+ ... + a j) % M所以如果你想要以 j 结尾的最佳和,你必须选择一个 s[i] i 是比你高的最小和。
因为如果s[i]> s[j]; s[i] = M - K;K
这个想法是我的尝试,首先你必须计算从 0 开始并以索引 i 结束的所有总和,然后你可以通过使用地图已经lower_bound有的二叉搜索来搜索值,并计算你可以用你找到的值做多少次求和。你必须把总和放在某个地方,以计算你能做多少次。
#include <iostream>
#include <map>
#define optimizar_io ios_base::sync_with_stdio(false);cin.tie(NULL);
using namespace std;
const int LN = 1e5;
long long N, M, num[LN];
map < long long, int > sum;
int main() {
optimizar_io
cin >> N >> M;
sum[0]++;
long long cont = 0, tmax = 0, res = 1, val;
map < long long, int > :: iterator best;
for (int i = 0; i < N; i++)
{
cin >> num[i];
cont = (cont + num[i]) % M;
if (tmax == cont)
res += sum[0];
if (tmax < cont)
tmax = cont, res = sum[0];
best = sum.lower_bound(cont + 1);
if (best != sum.end())
{
val = cont - (*best).first + M;
if (tmax == val)
res += (*best).second;
if (tmax < val)
tmax = val, res = (*best).second;
}
sum[cont]++;
}
cout << tmax << " " << res;
return 0;
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 不计算一个范围内的完美数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 数组中的"Maximum Sum mod M"范围:求和和计数
- 为什么此范围为Vectors求和的实现速度较慢
- 对复杂度为0(1)的索引范围内的值求和