Untitled

 avatar
unknown
c_cpp
a year ago
1.7 kB
2
Indexable
#include <iostream>
#include <algorithm>
using namespace std;

#define MAXN 200005
int a[MAXN];
struct ticket {
    int b;
    int c;
    int max_c; // 小于等于b的所有ticket中优惠力度最大的。
    ticket(): b(0), c(0), max_c(0) {}
    ticket(int b, int c): b(b), c(c), max_c(0) {}
    bool operator< (const ticket& other) const {
        bool res = true;
        if (b < other.b) {
            res = true;
        } else if (b == other.b) {
            res = c > other.c;
        } else if (b > other.b) {
            res = false;
        }
        return res;
    }
};
ticket ts[MAXN];
int main() {
    int n = 0, m = 0;
    scanf("%d %d", &n, &m);
    for (int i=0; i<n; i++) {
        scanf("%d", &a[i]);
    }
    for (int i=0; i<m; i++) {
        scanf("%d %d", &ts[i].b, &ts[i].c);
    }
    sort(ts, ts+m);
    int max_c = 0;
    for (int i=0; i<m; i++) {
        ts[i].max_c = max(max_c, ts[i].c);
        if (ts[i].c > max_c) {
            max_c = ts[i].c;
        }
    }
    long long res = 0;
    for (int i=0; i<n; i++) {
        auto iter = lower_bound(ts, ts+m, ticket(a[i], 0),
                                [](const ticket& val, const ticket& ele) {
            return val.b < ele.b;
        });
        if (iter == ts+m) {
            res = res + a[i] - ts[m-1].max_c;
        } else if (iter->b == a[i]) {
            res = res + a[i] - iter->max_c;
        } else {
            if (iter == ts) {
                res = res + a[i];
            } else {
                res = res + a[i] - (iter-1)->max_c;
            }
        }
    }
    printf("%lld", res);
    return 0;
}
Editor is loading...