首先可以先通过题面看出可以使用差分解决,但是看一眼数据范围n<=1e8,如果直接开数组打上一个前缀和板子空间上是肯定不能承受的,这里其实我一开始看错了范围打了一个线段树上去,果不其然的炸了,所以对于这题我们真正需要的是离散化
如果不了解什么是离散化的可以去《这里》看看
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int maxn = 2e5 + 5;
int n, m, q;
int a[maxn], s[maxn];
vector<int> ans;
vector<pii> add;
vector<int> query;
int find(int x)
{ //二分查找,也可使用lower_bound
int l = 0, r = ans.size() - 1;
while (l < r)
{
int mid = (l + r) >> 1;
if (ans[mid] >= x)
r = mid;
else
l = mid + 1;
}
return r + 1;
}
int main()
{
cin >> n >> m >> q;
for (int i = 0; i < m; i++)
{
int l, r;
cin >> l >> r;
add.push_back({l, 1}); //经典差分
add.push_back({r + 1, -1}); //
ans.push_back(l); //把受影响的下标加入
ans.push_back(r + 1); //
}
for (int i = 0; i < q; i++)
{
int x;
cin >> x;
query.push_back(x);
ans.push_back(x);
}
sort(ans.begin(), ans.end()); //进行离散化排序,去重
ans.erase(unique(ans.begin(), ans.end()), ans.end()); //
for (auto item : add)
{ //前缀和预处理
int x = find(item.first);
a[x] += item.second;
}
for (int i = 1; i <= ans.size(); i++)
s[i] = s[i - 1] + a[i]; //前缀和
for (auto item : query)
{
int l = find(item);
cout << s[l] << endl;
}
return 0;
}