离散化
自定义 unique 函数
#include
using namespace std;
#define all(x) x.begin(), x.end()
#define fi first
#define pb push_back
#define PII pair
#define se second
const int N = 3e5 + 10;
int n, m, a[N], s[N];
vector add, q;
vector num;
int find(int x){
int l = 0, r = num.size() - 1;
while (l < r){
int mid = l + r >> 1;
if (num[mid] >= x) r = mid;
else l = mid + 1;
}
return r + 1;
}
vector :: iterator unique(vector &a){
int j = 0;
for (int i = 0; i < a.size(); i++)
if (!i || a[i] != a[i - 1])
a[j++] = a[i];
return a.begin() + j;
}
void solve(){
cin >> n >> m;
for (int i = 0; i < n; i++){
int x, c;
scanf("%d%d", &x, &c);
num.pb(x);
add.pb({x, c});
}
for (int i = 0; i < m; i++){
int l, r;
scanf("%d%d", &l, &r);
q.pb({l, r});
num.pb(l);
num.pb(r);
}
sort(all(num));
num.erase(unique(num), num.end());
for (auto x : add){
int t = find(x.fi);
a[t] += x.se;
}
for (int i = 1; i <= num.size(); i++) s[i] = s[i - 1] + a[i];
for (auto x : q){
int l = find(x.fi), r = find(x.se);
cout << s[r] - s[l - 1] << "\n";
}
}
int main(){
solve();
return 0;
}
调用内置 unique 函数
#include
using namespace std;
#define all(x) x.begin(), x.end()
#define fi first
#define pb push_back
#define PII pair
#define se second
const int N = 3e5 + 10;
int n, m, a[N], s[N];
vector add, q;
vector num;
int find(int x){
int l = 0, r = num.size() - 1;
while (l < r){
int mid = l + r >> 1;
if (num[mid] >= x) r = mid;
else l = mid + 1;
}
return r + 1;
}
void solve(){
cin >> n >> m;
for (int i = 0; i < n; i++){
int x, c;
scanf("%d%d", &x, &c);
num.pb(x);
add.pb({x, c});
}
for (int i = 0; i < m; i++){
int l, r;
scanf("%d%d", &l, &r);
q.pb({l, r});
num.pb(l);
num.pb(r);
}
sort(all(num));
num.erase(unique(all(num)), num.end());
for (auto x : add){
int t = find(x.fi);
a[t] += x.se;
}
for (int i = 1; i <= num.size(); i++) s[i] = s[i - 1] + a[i];
for (auto x : q){
int l = find(x.fi), r = find(x.se);
cout << s[r] - s[l - 1] << "\n";
}
}
int main(){
solve();
return 0;
}
题目模板: https://www.acwing.com/problem/content/804/