Mary๋ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๋ ๊ฑธ ์ข์ํ๊ธดํ๋๋ฐ ์ ๊ทธ๋ฆฌ์ง ๋ชปํ๋ค.
Mary๊ฐ ํ๋ ์ง์ ์ธ ๊ฐ์ง๋ค.
D L R
: [L, R]์ segment๋ฅผ ๊ทธ๋ฆฐ๋ค. C I
: i๋ฒ์งธ์ ์๋ segment๋ฅผ ์ง์ด๋ค. ์ฆ, i๋ฒ์งธ์ ์ฌ๋ผ์์๋ ๋ชจ๋ segment๋ ์ ๊ฑฐ๋๋ค. Q L R
: [L, R]์์ ์ต์ ํ๋์ ๊ณตํต ํฌ์ธํธ๋ฅผ ๊ณต์ ํ๋ segment์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค. (์ฆ, ๊ฒน์น๋)ํ์ ํธ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์๊ฐ์ ํ ์ ์๋ค.
์ผ๋จ ์์ ๋ฒ์๊ฐ ๋งค์ฐ ํฌ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์์ถํด์ฃผ์ด์ผ ํ๋ค.
Offline ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
int main() {
vector<char> type(N);
vector<int> l(N), r(N), who(N), c(N);
vector<int> data;
int id = 0;
for (int i = 0; i < N; ++i) {
cin >> type[i];
if (type[i] == 'C') {
cin >> c[i];
} else if (type[i] == 'D') {
cin >> l[i] >> r[i];
who[++id] = i;
} else {
cin >> l[i] >> r[i];
}
}
data = vector<int>(l.begin(), l.end());
data.insert(data.end(), r.begin(), r.end());
sort(data.begin(), data.end());
data.erase(unique(data.begin(), data.end()), data.end());
}
๐ std::unique
Remove consecutive duplicates in range. ๋ฒ์ ๋ด ์ค๋ณต๋ ์์๋ฅผ ์ ๊ฑฐํ๋ค.
์ค์ ๋ก ์ ๊ฑฐํ๋ ๊ฒ์ ์๋์ ์ฃผ์. ์์ ์ ์ผํ ๊ฐ๋ค์ ์ฑ์ ๋ฃ๊ณ , ์ ๋ ฌ๋์ง ์์ ์์ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ๋ํ unique ํจ์๋ ์๊ณผ ๋ค์ ์์๋ค์ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์ ๋ ฅ ๋ฒกํฐ๊ฐ ์ ๋ ฌ๋ ์ํ์ด์ด์ผ ํ๋ค.
template <class FowardIterator> ForwardIterator unique (ForwardIterator first, ForwardIterator last) { if (first == last) return last; ForwardIterator result = first; while(++first != last) { if(!(*result == *first)) *(++result) = *first; } return ++result; }
๋ฌธ์ ์ ์กฐ๊ฑด์ ๊ต์ฐจํ๋ segment์ ๊ฐ์๋ฅผ ๊ตฌํ๋ผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ, ๊ต์ฐจํ๋ segment๊ฐ ์๋ ๊ต์ฐจํ์ง ์๋ segment์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค๋ฉด ์ด๋จ๊น?
์๋ฅผ ๋ค์ด, [l ,r]์์ ๊ต์ฐจํ๋ segment์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค๊ณ ํ์. ๊ทธ๋ฌ๋ฉด ํ์ํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ ์ฒด ์ธ๊ทธ๋จผํธ์ ๊ฐ์์์ ์์ ๋ ๊ฐ๋ฅผ ๋นผ์ฃผ์. ๐ ์ค~ ๋๋ํ๋ค.