考察知识点:贪心、优先队列

读入服务器的信息,按照 (l, r, v) 升序排序,遍历每一位用户,为每一位用户分配符合条件的服务器中 r 最小的服务器,对应的服务器的 v 值减一,若成功为用户分配服务器,则答案 ans 加一。

时间复杂度

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pll> vpll;

struct Node
{
    int l, r, v;
    bool operator<(const Node &s) const
    {
        if (l != s.l)
            return l < s.l;
        if (r != s.r)
            return r < s.r;
        else
            return v < s.v;
    }
};

struct cmp
{
    bool operator()(const Node &a, const Node &b)
    {
        if (a.r != b.r)
            return a.r > b.r;
        else
            return a.v > b.v;
    }
};

void solve()
{
    int n, m;
    while (cin >> n >> m)
    {
        vector<Node> server(m);
        for (int i = 0; i < m; i++)
            cin >> server[i].l >> server[i].r >> server[i].v;
        sort(server.begin(), server.end());
        priority_queue<Node, vector<Node>, cmp> pq;  // 小根堆
        int cur = 0, ans = 0;
        for (int i = 1; i <= n; i++)
        {
            while (server[cur].l <= i)
            {
                pq.push(server[cur]);
                cur++;
            }
            while (!pq.empty() && (pq.top().r < i || !pq.top().v))
                pq.pop();
            if (pq.empty())
                continue;
            auto tmp = pq.top();
            tmp.v--;
            pq.pop();
            pq.push(tmp);
            ans++;
        }
        cout << ans << endl;
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t = 1;
    // cin >> t;
    while (t--)
        solve();
    return 0;
}