区間の両端だけ記憶して、それをマージしていく。
- class Over9000Rocks {
- public:
- int countPossibilities(vector <int> L, vector <int> U)
- {
- const int size = L.size();
- vector< pair<int, int> > v;
- for (int bit = 1; bit < (int)(1 << size); ++bit) {
- int mn = 0;
- int mx = 0;
- for (int i = 0; i < (int)size; ++i) {
- if (bit & (1 << i)) {
- mx += U[i];
- mn += L[i];
- }
- }
- if (9001 <= mx) {
- v.push_back(make_pair(max(9001, mn), mx));
- }
- }
- sort(v.begin(), v.end());
- for (int i = 0; i + 1 < (int)v.size(); ++i) {
- if (v[i+1].first <= v[i].second) {
- v[i].second = max(v[i].second, v[i + 1].second);
- v.erase(v.begin() + i + 1);
- i = -1;
- }
- }
- int sum = 0;
- for (int i = 0; i < (int)v.size(); ++i) {
- sum += v[i].second - v[i].first + 1;
- }
- return sum;
- }