[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();
}