今日で6日目です。今日の問題はあるアルゴリズムを使うと楽に解けるよ、とオススメしてもらったので勉強がてら解いたものです。
Difficultyは1283(水)です。(推定値なので実際の難易度とズレがある可能性があります)
(AtCoder Problemsより)
diffは高めですが諦めずに解いてみてください。
提出コードと考えたこと
まずアルゴリズムについて。累積和を用いるのですが、その中でもいもす法と呼ばれる物が非常に便利です。リンク先の1次元0次いもす法を見てください。
問題例とこの問題はほぼ同じです。
以下は提出コードです。
#include <bits/stdc++.h>
using namespace std;
const int TYPE = 1000000;
int main(){
int n;
cin >> n;
vector<int> s(TYPE + 1,0);
for(int i = 0;i < n;i++){
int a,b;
cin >> a >> b;
s[a]++; s[b + 1]--;
}
for(int i = 0;i < TYPE;i++) s[i + 1] += s[i];
auto iter = max_element(s.begin(),s.end());
cout << *iter << endl;
return 0;
}
計算量の面で工夫は必要ですが、発想自体は単純です。ある絵具を何人が選んだかを \(1,-1\) の区間で記録しておき、累積和である絵具が何人に選ばれたのかを計算します。
余談ですが、配列から最大値を取り出すのにイテレータを利用する方法を覚えました。(16行目)
int index = distance(s.begin(),iter)
とすればインデックスも得られます。(最大値が複数ある場合は最も小さいインデックスが返ってきます)
コメント