[CCPC2020绵阳J] Joy of Handcraft

[CCPC2020绵阳J] Joy of Handcraft - set

Description

给你n盏灯,每盏灯亮的周期为ti( 1 ~ ti 亮,ti+1 ~ 2ti灭,然后循环往复),每盏灯的亮度为 xi。 问你 1~m 中每一秒最亮的灯的亮度。

Solution

每种循环周期我们只保留最亮的那个,这样总的变化次数不超过 (O(nlog n))

于是抽出所有事件排序后用 multiset 维护一下即可

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

#define int long long

int caseid = 0;

void solve()
{
    ++caseid;
    int n, m;
    cin >> n >> m;
    map<int, int> mp;
    for (int i = 1; i <= n; i++)
    {
        int t, x;
        cin >> t >> x;
        mp[t] = max(mp[t], x);
    }
    vector<pair<int, int>> vec;
    for (auto [t, x] : mp)
    {
        int flag = 1;
        for (int j = 1; j <= m; j += t)
        {
            vec.push_back({j, flag * x});
            flag = -flag;
        }
    }
    sort(vec.begin(), vec.end());
    multiset<int> ms;
    int pos = 0;
    cout << "Case #" << caseid << ": ";
    for (int i = 1; i <= m; i++)
    {
        while (pos < vec.size() && vec[pos].first <= i)
        {
            int x = vec[pos].second;
            if (x > 0)
                ms.insert(x);
            else
                ms.erase(ms.find(-x));
            ++pos;
        }
        if (ms.size() == 0)
            cout << 0;
        else
            cout << *ms.rbegin();
        if (i < m)
            cout << " ";
    }
    cout << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--)
        solve();
}
原文地址:https://www.cnblogs.com/mollnn/p/14648265.html