📅  最后修改于: 2023-12-03 15:23:32.758000             🧑  作者: Mango
给定一个长度为n的整数数组,进行q次操作,每次操作将区间[l, r]内的所有数加上val,最后输出数组中不同数字的数量。
首先看到这道题目,很容易想到暴力解法,即对每次操作后的数组进行去重统计。但是这种做法的时间复杂度为O(qnlogn),无法通过本题。
我们可以利用哈希表来解决这个问题。对于每次操作,我们将区间[l, r]内的所有数加上val后,统计数组中每个数字出现的次数。最后遍历哈希表,计算不同数字的数量即可。
具体实现时,使用unordered_map来实现哈希表,时间复杂度为O(qn)。
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
int n, q;
cin >> n >> q;
int a[n+1], val[n+1] = {0};
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
while (q--)
{
int l, r, v;
cin >> l >> r >> v;
val[l] += v;
if (r+1 <= n)
{
val[r+1] -= v;
}
}
unordered_map<int, int> mp;
for (int i = 1; i <= n; i++)
{
val[i] += val[i-1];
mp[a[i]+val[i]]++;
}
cout << mp.size() << endl;
return 0;
}
Markdown演示效果:
给定一个长度为n的整数数组,进行q次操作,每次操作将区间[l, r]内的所有数加上val,最后输出数组中不同数字的数量。
我们可以利用哈希表来解决这个问题。对于每次操作,我们将区间[l, r]内的所有数加上val后,统计数组中每个数字出现的次数。最后遍历哈希表,计算不同数字的数量即可。
具体实现时,使用unordered_map来实现哈希表,时间复杂度为O(qn)。
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
int n, q;
cin >> n >> q;
int a[n+1], val[n+1] = {0};
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
while (q--)
{
int l, r, v;
cin >> l >> r >> v;
val[l] += v;
if (r+1 <= n)
{
val[r+1] -= v;
}
}
unordered_map<int, int> mp;
for (int i = 1; i <= n; i++)
{
val[i] += val[i-1];
mp[a[i]+val[i]]++;
}
cout << mp.size() << endl;
return 0;
}