abc221D 统计在线游戏人数

85 阅读1分钟

题面:有一款在线游戏,共有n名注册玩家,第i名玩家从第a[i]天开始上线,持续在线b[i]天。现在要统计在线人数为x[i]的天数,其中1 <= x[i] <= n。

范围:1 <= n <= 2E5; 1 <= a[i],b[i] <= 1E9;

分析:先按差分更新,然后求前缀和还原,再遍历一次统计答案,时间复杂度O(n)。

#include <bits/stdc++.h>
int n, ans[200001];
std::map<int,int> mp;
void solve() {
    std::cin >> n;
    for (int i = 1; i <= n; i++) {
        int a, b;
        std::cin >> a >> b;
        mp[a] += 1;
        mp[a+b] -= 1;
    }
    int cur = 0;
    for (auto &[k,v] : mp) {
        v += cur;
        cur = v;
    }
    int K = 0, V = 0;
    for (auto &[k,v] : mp) {
        if (V) {
            ans[V] += k - K;
        }
        K = k;
        V = v;
    }
    for (int i = 1; i <= n; i++) {
        std::cout << ans[i] << " ";
    }
    std::cout << "\n";
}
int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:差分