ICL(Interval Container Library)<br />2011/2/26 Boost 勉強会 #4 未発表<br />@yak_ex / 新 康孝<br />紹介<br />詳解<br />
自己紹介<br />氏名: 新 康孝 (あたらし やすたか)<br />Twitter ID: yak_ex<br />Web: http://yak3.myhome.cx:8080/junks<br />C++ / Perl が主戦場<br ...
ぼくのかんがえた「ぶーすと」のぶんるい<br />アプリより<br />大規模<br />小規模<br />実装より<br />
ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.25<br />アプリより<br />test<br />graph<br />progress_display たんはココ<br />thread<br />大規模<br />小規模<b...
ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.30<br />アプリより<br />異次元<br />preprocessor<br />test<br />spirit<br />date_time<br />graph<br />...
ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.35<br />アプリより<br />異次元<br />preprocessor<br />asio<br />test<br />gil<br />wave<br />spirit<br...
ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.40<br />アプリより<br />異次元<br />preprocessor<br />asio<br />test<br />gil<br />accmulators<br />wa...
ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.45<br />アプリより<br />異次元<br />preprocessor<br />asio<br />test<br />gil<br />accmulators<br />wa...
ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.46<br />アプリより<br />異次元<br />preprocessor<br />asio<br />test<br />gil<br />accmulators<br />wa...
ここで競技コーディングのお時間です<br />akira さん(仮名)はパーティーを開くことになりました。N 人のお客さんが参加する予定ですが参加時間帯[si, ti)が皆ばらばらです。場所の予約のために参加人数の最も多い時間帯を知りたいのでプ...
解答例全文 using ICL<br />#include <iostream><br />#include <algorithm><br />#include <utility><br />#include <boost/icl/interv...
解答例全文 using ICL<br />#include <iostream><br />#include <algorithm><br />#include <utility><br />#include <boost/icl/interv...
解答例 入力と登録<br />    boost::icl::interval_map<int, int> sum;<br />    int n;<br />    std::cin >> n;<br />    for(int i = 0;...
解答例 最大値取得<br />typedef boost::icl::interval_map<int, int>::value_type value_type;<br />    auto it = max_element(sum.begin...
Interval Container Library<br />1.46 で導入<br />開区間、閉区間等全部取り扱い可能<br />区間に対する集合演算、「集計」が可能<br />interval_set, interval_map<br ...
Upcoming SlideShare
Loading in …5
×

Brief introduction of Boost.ICL

1,395 views

Published on

Not presented anywhere.

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,395
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Brief introduction of Boost.ICL

  1. 1.    ICL(Interval Container Library)<br />2011/2/26 Boost 勉強会 #4 未発表<br />@yak_ex / 新 康孝<br />紹介<br />詳解<br />
  2. 2. 自己紹介<br />氏名: 新 康孝 (あたらし やすたか)<br />Twitter ID: yak_ex<br />Web: http://yak3.myhome.cx:8080/junks<br />C++ / Perl が主戦場<br />現在、仕事でコードに触れていないので競技プログラミング(TopCoder、Codeforces)で潤い補充<br />闇の軍団に憧れるただの C++ 好き<br />今回は ICL のさわりだけ、というかさわりしか分からない<br />
  3. 3. ぼくのかんがえた「ぶーすと」のぶんるい<br />アプリより<br />大規模<br />小規模<br />実装より<br />
  4. 4. ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.25<br />アプリより<br />test<br />graph<br />progress_display たんはココ<br />thread<br />大規模<br />小規模<br />regex<br />crc<br />pool<br />tokenizer<br />random<br />lexical_cast<br />function<br />array<br />rational<br />type_traits<br />timer<br />iterators<br />operators<br />any<br />tuple<br />実装より<br />
  5. 5. ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.30<br />アプリより<br />異次元<br />preprocessor<br />test<br />spirit<br />date_time<br />graph<br />filesystem<br />progress_display たんはココ<br />thread<br />大規模<br />小規模<br />format<br />regex<br />crc<br />pool<br />tokenizer<br />random<br />lexical_cast<br />function<br />array<br />lambda<br />rational<br />type_traits<br />timer<br />iterators<br />multi_array<br />mpl<br />any<br />optional<br />tuple<br />実装より<br />
  6. 6. ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.35<br />アプリより<br />異次元<br />preprocessor<br />asio<br />test<br />gil<br />wave<br />spirit<br />date_time<br />graph<br />filesystem<br />progress_display たんはココ<br />statechart<br />thread<br />serialization<br />大規模<br />小規模<br />format<br />program_options<br />interprocess<br />regex<br />crc<br />pool<br />xpressive<br />tokenizer<br />random<br />lexical_cast<br />bimap<br />function<br />multi_index<br />intrusive<br />parameter<br />array<br />lambda<br />range<br />ptr_container<br />fusion<br />variant<br />rational<br />type_traits<br />timer<br />iterators<br />foreach<br />multi_array<br />mpl<br />typeof<br />any<br />optional<br />tuple<br />実装より<br />
  7. 7. ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.40<br />アプリより<br />異次元<br />preprocessor<br />asio<br />test<br />gil<br />accmulators<br />wave<br />spirit<br />date_time<br />graph<br />filesystem<br />progress_display たんはココ<br />statechart<br />thread<br />serialization<br />大規模<br />小規模<br />format<br />program_options<br />interprocess<br />proto<br />regex<br />crc<br />pool<br />xpressive<br />tokenizer<br />random<br />lexical_cast<br />scope_exit<br />bimap<br />function<br />unordered<br />multi_index<br />intrusive<br />parameter<br />array<br />lambda<br />flyweight<br />range<br />ptr_container<br />fusion<br />variant<br />rational<br />type_traits<br />timer<br />iterators<br />foreach<br />multi_array<br />mpl<br />typeof<br />any<br />optional<br />tuple<br />実装より<br />
  8. 8. ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.45<br />アプリより<br />異次元<br />preprocessor<br />asio<br />test<br />gil<br />accmulators<br />wave<br />spirit<br />date_time<br />graph<br />property_tree<br />filesystem<br />polygon<br />progress_display たんはココ<br />msm<br />statechart<br />thread<br />serialization<br />大規模<br />小規模<br />uuid<br />format<br />program_options<br />interprocess<br />proto<br />regex<br />crc<br />pool<br />xpressive<br />tokenizer<br />random<br />lexical_cast<br />scope_exit<br />bimap<br />function<br />unordered<br />multi_index<br />intrusive<br />parameter<br />array<br />lambda<br />flyweight<br />range<br />ptr_container<br />fusion<br />variant<br />rational<br />type_traits<br />timer<br />iterators<br />foreach<br />multi_array<br />mpl<br />typeof<br />any<br />optional<br />tuple<br />実装より<br />
  9. 9. ぼくのかんがえた「ぶーすと」のぶんるい<br />~1.46<br />アプリより<br />異次元<br />preprocessor<br />asio<br />test<br />gil<br />accmulators<br />wave<br />spirit<br />date_time<br />graph<br />property_tree<br />filesystem<br />polygon<br />ICL<br />progress_display たんはココ<br />msm<br />statechart<br />thread<br />serialization<br />大規模<br />小規模<br />uuid<br />format<br />program_options<br />interprocess<br />proto<br />regex<br />crc<br />pool<br />xpressive<br />tokenizer<br />random<br />lexical_cast<br />scope_exit<br />bimap<br />function<br />unordered<br />multi_index<br />intrusive<br />parameter<br />array<br />lambda<br />flyweight<br />range<br />ptr_container<br />fusion<br />variant<br />rational<br />type_traits<br />timer<br />iterators<br />foreach<br />multi_array<br />mpl<br />typeof<br />any<br />optional<br />tuple<br />実装より<br />
  10. 10. ここで競技コーディングのお時間です<br />akira さん(仮名)はパーティーを開くことになりました。N 人のお客さんが参加する予定ですが参加時間帯[si, ti)が皆ばらばらです。場所の予約のために参加人数の最も多い時間帯を知りたいのでプログラムを作って akira さんを助けてあげましょう。<br />1 ≦ N ≦ 1000<br />-109 ≦ si < ti ≦ 109,si,ti は整数 (i=1,2,…,N)<br />参加人数が同じ時間帯が隣接している場合、参加者が異なっていても一つの時間帯と見なす<br />同一参加人数の時間帯が複数ある場合は最長の時間帯を、同じ長さの時間帯が複数ある場合は開始時刻がもっとも早い時間帯を返す<br />入力: N<改行>s1<空白>t1<改行>…sN<空白>tN<改行><br />出力:開始時刻<空白>終了時刻<空白>人数<改行><br />
  11. 11. 解答例全文 using ICL<br />#include <iostream><br />#include <algorithm><br />#include <utility><br />#include <boost/icl/interval_map.hpp><br />int main(void)<br />{<br /> boost::icl::interval_map<int, int> sum;<br /> int n;<br /> std::cin >> n;<br /> for(int i = 0; i < n; ++i) {<br /> int s, t;<br /> std::cin >> s >> t;<br /> sum += std::make_pair(boost::icl::interval<int>::right_open(s, t), 1);<br /> }<br /> typedef boost::icl::interval_map<int, int>::value_type value_type;<br /> auto it = max_element(sum.begin(), sum.end(), [](const value_type &v1, const value_type &v2) {<br /> return<br /> v1.second < v2.second ||<br /> (v1.second == v2.second && v1.first.upper() - v1.first.lower() < v2.first.upper() - v2.first.lower()) ||<br /> (v1.second == v2.second && v1.first.upper() - v1.first.lower() == v2.first.upper() - v2.first.lower() && <br /> v1.first.lower() < v2.first.lower());<br /> });<br /> std::cout << it->first.lower() << ' ' << it->first.upper() << ' ' << it->second << std::endl;<br /> return 0;<br />}<br />#include 含めて 25 行<br />
  12. 12. 解答例全文 using ICL<br />#include <iostream><br />#include <algorithm><br />#include <utility><br />#include <boost/icl/interval_map.hpp><br />int main(void)<br />{<br /> boost::icl::interval_map<int, int> sum;<br /> int n;<br /> std::cin >> n;<br /> for(int i = 0; i < n; ++i) {<br /> int s, t;<br /> std::cin >> s >> t;<br /> sum += std::make_pair(boost::icl::interval<int>::right_open(s, t), 1);<br /> }<br /> typedef boost::icl::interval_map<int, int>::value_type value_type;<br /> auto it = max_element(sum.begin(), sum.end(), [](const value_type &v1, const value_type &v2) {<br /> return<br /> v1.second < v2.second ||<br /> (v1.second == v2.second && v1.first.upper() - v1.first.lower() < v2.first.upper() - v2.first.lower()) ||<br /> (v1.second == v2.second && v1.first.upper() - v1.first.lower() == v2.first.upper() - v2.first.lower() && <br /> v1.first.lower() < v2.first.lower());<br /> });<br /> std::cout << it->first.lower() << ' ' << it->first.upper() << ' ' << it->second << std::endl;<br /> return 0;<br />}<br />ヘッダのインクルード<br />入力と登録<br />最大値取得<br />出力<br />
  13. 13. 解答例 入力と登録<br /> boost::icl::interval_map<int, int> sum;<br /> int n;<br /> std::cin >> n;<br /> for(int i = 0; i < n; ++i) {<br /> int s, t;<br /> std::cin >> s >> t;<br /> sum += std::make_pair(boost::icl::interval<int>::right_open(s, t), 1);<br /> }<br />今回は数だが集合も可能<br />右開区間 [s, t)<br />1<br />1<br />+<br />+<br />1<br />1<br />split_interval_map<br />1<br />interval_map<br />2<br />1<br />1<br />1<br />1<br />
  14. 14. 解答例 最大値取得<br />typedef boost::icl::interval_map<int, int>::value_type value_type;<br /> auto it = max_element(sum.begin(), sum.end(), [](const value_type &v1, const value_type &v2) {<br /> return<br /> v1.second < v2.second ||<br /> (v1.second == v2.second &&<br /> v1.first.upper() - v1.first.lower() < v2.first.upper() - v2.first.lower()) ||<br /> (v1.second == v2.second && <br /> v1.first.upper() - v1.first.lower() == v2.first.upper() - v2.first.lower() &&<br /> v1.first.lower() < v2.first.lower());<br /> });<br />// 集計値は second<br />// 区間は first (upper(), lower() で境界値)<br />集計された区間の結果を iteration 可能なので普通に max_element で最大値取得<br />
  15. 15. Interval Container Library<br />1.46 で導入<br />開区間、閉区間等全部取り扱い可能<br />区間に対する集合演算、「集計」が可能<br />interval_set, interval_map<br />区間の統合方法として join, separate, split を選択可能<br />ストリーム出力有り(例:{(1,3][4.6](7,8]})<br />Traits 用意すれば自前の interval を突っ込むことも可能<br />数値に限定されないので例えばcotinuous_interval<std::string> w(“a”, “c”) // right_openとか書くと a, b で始まる文字列全部を表すことになる。<br />Example がいっぱいなのでそれ見ればOK<br />interval_set a<br />interval_set b<br />interval_set a - b<br />

×