Процессор чтоль какой древний? 10000 * 10000 = 100 000 000 пар операций (сравнить/перейти к следующему) - это меньше секунды.
и что теперь? все алгоритмы писать через ж-у? а если будет миллион кусков? я априори не знаю сколько там их будет.
В общем получается что-то типа этого: Код (Text): #include <set> typedef unsigned int uint_t; typedef signed int int_t; typedef unsigned __int8 uint8_t; typedef signed __int8 int8_t; struct block_t { mutable size_t start; mutable size_t end; inline block_t(size_t start, size_t end) : start(start), end(end) { } inline bool operator < (block_t const& val) const { return end < val.start; } inline bool operator == (block_t const& val) const { return start <= val.end && end >= val.start; } }; class blocks_t : private std::set<block_t> { private: typedef std::set<block_t> inherited; private: void union_left_neighbors(iterator i, block_t& block) { if ((*i).start <= block.start) { block.start = (*i).start; } else { iterator prev = i; while (1) { -- prev; if (prev == inherited::end()) break; if (*prev < block) break; if ((*prev).start <= block.start) { block.start = (*prev).start; inherited::erase(prev); break; } prev = inherited::erase(prev); } } } void union_right_neighbors(iterator i, block_t& block) { if (block.end <= (*i).end) { block.end = (*i).end; } else { iterator next = i; ++ next; while (1) { if (next == inherited::end()) break; if (block < *next) break; if (block.end <= (*next).end) { block.end = (*next).end; inherited::erase(next); break; } next = inherited::erase(next); } } } public: typedef inherited::iterator iterator; public: void insert_block(size_t start, size_t size) { block_t block(start, start + size); std::pair<iterator, bool> res = inherited::insert(block); if (res.second) return; union_left_neighbors(res.first, block); union_right_neighbors(res.first, block); (*res.first).start = block.start; (*res.first).end = block.end; } }; int main() { blocks_t b; b.insert_block(1, 1); b.insert_block(3, 1); b.insert_block(5, 1); b.insert_block(7, 1); b.insert_block(9, 1); b.insert_block(11, 1); b.insert_block(0, 20); b.insert_block(1, 1); b.insert_block(3, 1); b.insert_block(5, 1); b.insert_block(7, 1); b.insert_block(9, 1); b.insert_block(11, 1); }
srm Если Вам не к спеху, могу декомпилировать один файлик, там как раз используется такой алгоритм на примере файлов. Алгоритм практически идентичен тому, что предложил r90 с поправками l_inc.