一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
二、解题报告
1、思路分析
考虑每个线段如果被框住一半,那么其中点一定在区间内
所以我们前缀和前缀区间中点的数目
但是如果直接求中点(l + r) / 2会有精度问题,我们将[1, n] 映射到 [n + 1, n]就能避免精度问题
那么每次查询[L, R]内的中点数目就等价于查询[L * 2 - 1, R * 2]内的中点数目
2、复杂度
时间复杂度: O(n)空间复杂度:O(n)
3、代码详解
cpp
#include <bits/stdc++.h>
using i64 = long long;
const int N = 2e6 + 10;
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<int> pre(N);
for (int i = 0, l, r; i < n; i ++ )
std::cin >> l >> r, ++ pre[l + r];
for (int i = 1, ed = pre.size(); i < ed; i ++ )
pre[i] += pre[i - 1];
for (int i = 0, l, r; i < m; i ++ ) {
std::cin >> l >> r;
std::cout << pre[r << 1] - pre[(l << 1) - 1] << '\n';
}
}
int main () {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
int _ = 1;
// std::cin >> _;
while (_ --)
solve();
return 0;
}