ABC080: D - Recording
問題
解説
同じチャンネルで同一時刻に放送しないので、別々のチャンネルで重なり合う線分の数の最大値が答えとなる。 時刻が整数で[tex:105]以下あることに着目すれば、いもす法で解くのが楽だと分かる。
サンプルを見ながら条件を確認すると楽。同じチャンネルで連続して放映している場合は、先に区間をつなげてしまうと考えやすいと思う。 簡単に区間をつなげるために、チャンネルごとにセグメントを持って時刻でソートした。
区間系の典型的な問題というのもあるが、400点にしては簡単な印象。
int main() { int N, C; cin >> N >> C; vector<deque<pair<int, int>>> vs(C); for (int i=0; i<N; i++) { int s, t, c; cin >> s >> t >> c; c--; vs[c].emplace_back(s, t); } for (int i = 0; i < C; i++) { sort(vs[i].begin(), vs[i].end()); } for (int i = 0; i < C; i++) { if (vs[i].empty()) continue; deque<pair<int, int>> nv; nv.push_back(vs[i][0]); for (int j = 1; j < (int)vs[i].size(); j++) { if (nv.back().second == vs[i][j].first) { auto e = nv.back(); nv.pop_back(); e.second = vs[i][j].second; nv.push_back(e); } else { nv.push_back(vs[i][j]); } } vs[i] = nv; } vector<int> line(100001); for (auto channel: vs) { for (auto p: channel) { for (int i = p.first; i <= p.second; i++) { line[i]++; } } } cout << *max_element(line.begin(), line.end()) << "\n"; }