区间和(离散化)
【摘要】
假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r]
之间的所有数的和。
输入格式
第一行包含两个整数 n和 m。
接下来 n行,每行包含两个整数 x 和 c。
再...
假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r]
之间的所有数的和。
输入格式
第一行包含两个整数 n和 m。
接下来 n行,每行包含两个整数 x 和 c。
再接下来 m行,每行包含两个整数 l 和 r。
输出格式
共 m行,每行输出一个询问中所求的区间内数字和。
数据范围
−10^9≤x≤10^9,
1≤n,m≤10^5,
−10^9≤l≤r≤10^9,
−10000≤c≤10000
输入样例:
-
3 3
-
1 2
-
3 6
-
7 5
-
1 3
-
4 6
-
7 8
输出样例:
-
8
-
0
-
5
分析:这其实是一道离散化的板子题,没有什么难度,重点就在与发现其中的奥秘:
由于区间较大,开一个很长的数组没有什么意义,所以说需要利用离散化,把分得很开的数组聚合到一起,通过二分来找到你要找的元素,把这个下标的映射关系搞到手,仅此而已。
-
#include <iostream>
-
#include <vector>
-
#include <algorithm>
-
-
using namespace std;
-
-
typedef pair<int, int> PII;
-
-
const int N = 300010;
-
-
int n, m;
-
int a[N], s[N];
-
-
vector<int> alls;
-
vector<PII> add, query;
-
-
int find(int x)
-
{
-
int l = 0, r = alls.size() - 1;
-
while (l < r)
-
{
-
int mid = l + r >> 1;
-
if (alls[mid] >= x) r = mid;
-
else l = mid + 1;
-
}
-
return r + 1;
-
}
-
-
vector<int>::iterator unique(vector<int> &a)
-
{
-
int j = 0;
-
for (int i = 0; i < a.size(); i ++ )
-
if (!i || a[i] != a[i - 1])
-
a[j ++ ] = a[i];
-
// a[0] ~ a[j - 1] 所有a中不重复的数
-
-
return a.begin() + j;
-
}
-
-
int main()
-
{
-
cin >> n >> m;
-
for (int i = 0; i < n; i ++ )
-
{
-
int x, c;
-
cin >> x >> c;
-
add.push_back({x, c});
-
-
alls.push_back(x);
-
}
-
-
for (int i = 0; i < m; i ++ )
-
{
-
int l, r;
-
cin >> l >> r;
-
query.push_back({l, r});
-
-
alls.push_back(l);
-
alls.push_back(r);
-
}
-
-
// 去重
-
sort(alls.begin(), alls.end());
-
alls.erase(unique(alls), alls.end());
-
//unique将相同元素移到最后,返回最后一个不重复元素的地址\
-
erase删除所给定区间+1的所有元素
-
-
// 处理插入
-
for (auto item : add)// c++11 for (auto:迭代器名称 要遍历的容器 )
-
{
-
int x = find(item.first);
-
a[x] += item.second;
-
}
-
-
// 预处理前缀和
-
for (int i = 1; i <= alls.size(); i ++ ) s[i] = s[i - 1] + a[i];
-
-
// 处理询问
-
for (auto item : query)
-
{
-
int l = find(item.first), r = find(item.second);
-
cout << s[r] - s[l - 1] << endl;
-
}
-
-
return 0;
-
}
文章来源: blog.csdn.net,作者:irrationality,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_54227557/article/details/120604627
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)