#include <iostream> #include <sstream> #include <string> #include <map> using namespace std; enum granice { l_zolty = 2, //zamiast średników stosuje się przecinki r_zolty = 3, l_niebieski = 4, r_niebieski = 5, l_czerwony = 6, r_czerwony = 7 }; main (int arc, char ** argv) { int n,m,suma = 0; cin >> n >> m; //cout << m << " " << n << '\n'; std::multimap<int, granice> rzad_puszek; for (int i = 0; i < m; i++) { int l,r,k = 0; cin >> l >> r >> k; //cout << l << " " << r << " " << k << '\n'; rzad_puszek.insert(pair <int, granice> (l, static_cast<granice>(2*k))); rzad_puszek.insert(pair <int, granice> (r+1, static_cast<granice>(2*k+1))); } multimap <int, granice> :: iterator itr; //for (itr = rzad_puszek.begin(); itr != rzad_puszek.end(); ++itr) //{ // cout << '\t' << itr->first // << '\t' << itr->second << '\n'; //} int zolty = 0; int niebieski = 0; int czerwony = 0; int zielony = 0; for (itr = rzad_puszek.begin(); itr != rzad_puszek.end(); ++itr) { //cout << '\t' << itr->first // << '\t' << itr->second << '\n'; switch( itr->second ) { case l_zolty: if ((zolty == 0) && (niebieski > 0) && (czerwony == 0)) { zielony = itr->first; //cout << "zielony:" << zielony <<'\n'; } zolty++; //cout << "zolty:" << zolty <<'\n'; break; case r_zolty: if ((zolty == 1) && (niebieski > 0) && (czerwony == 0)) { suma += itr->first - zielony; //cout << "suma:" << suma <<'\n'; } zolty--; //cout << "zolty:" << zolty <<'\n'; break; case l_niebieski: if ((zolty > 0) && (niebieski == 0) && (czerwony == 0)) { zielony = itr->first; //cout << "zielony:" << zielony <<'\n'; } niebieski++; //cout << "niebieski:" << niebieski <<'\n'; break; case r_niebieski: if ((zolty > 0) && (niebieski == 1) && (czerwony == 0)) { suma += itr->first - zielony; //cout << "suma:" << suma <<'\n'; } niebieski--; //cout << "niebieski:" << niebieski <<'\n'; break; case l_czerwony: if ((zolty > 0) && (niebieski > 0) && (czerwony == 0)) { suma += itr->first - zielony; //cout << "suma:" << suma <<'\n'; } czerwony++; //cout << "czerwony:" << czerwony <<'\n'; break; case r_czerwony: if ((zolty > 0) && (niebieski > 0) && (czerwony == 1)) { zielony = itr->first; //cout << "zielony:" << zielony <<'\n'; } czerwony--; //cout << "czerwony:" << czerwony <<'\n'; break; default: //jakiś kod break; } } cout << suma <<'\n'; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include <iostream> #include <sstream> #include <string> #include <map> using namespace std; enum granice { l_zolty = 2, //zamiast średników stosuje się przecinki r_zolty = 3, l_niebieski = 4, r_niebieski = 5, l_czerwony = 6, r_czerwony = 7 }; main (int arc, char ** argv) { int n,m,suma = 0; cin >> n >> m; //cout << m << " " << n << '\n'; std::multimap<int, granice> rzad_puszek; for (int i = 0; i < m; i++) { int l,r,k = 0; cin >> l >> r >> k; //cout << l << " " << r << " " << k << '\n'; rzad_puszek.insert(pair <int, granice> (l, static_cast<granice>(2*k))); rzad_puszek.insert(pair <int, granice> (r+1, static_cast<granice>(2*k+1))); } multimap <int, granice> :: iterator itr; //for (itr = rzad_puszek.begin(); itr != rzad_puszek.end(); ++itr) //{ // cout << '\t' << itr->first // << '\t' << itr->second << '\n'; //} int zolty = 0; int niebieski = 0; int czerwony = 0; int zielony = 0; for (itr = rzad_puszek.begin(); itr != rzad_puszek.end(); ++itr) { //cout << '\t' << itr->first // << '\t' << itr->second << '\n'; switch( itr->second ) { case l_zolty: if ((zolty == 0) && (niebieski > 0) && (czerwony == 0)) { zielony = itr->first; //cout << "zielony:" << zielony <<'\n'; } zolty++; //cout << "zolty:" << zolty <<'\n'; break; case r_zolty: if ((zolty == 1) && (niebieski > 0) && (czerwony == 0)) { suma += itr->first - zielony; //cout << "suma:" << suma <<'\n'; } zolty--; //cout << "zolty:" << zolty <<'\n'; break; case l_niebieski: if ((zolty > 0) && (niebieski == 0) && (czerwony == 0)) { zielony = itr->first; //cout << "zielony:" << zielony <<'\n'; } niebieski++; //cout << "niebieski:" << niebieski <<'\n'; break; case r_niebieski: if ((zolty > 0) && (niebieski == 1) && (czerwony == 0)) { suma += itr->first - zielony; //cout << "suma:" << suma <<'\n'; } niebieski--; //cout << "niebieski:" << niebieski <<'\n'; break; case l_czerwony: if ((zolty > 0) && (niebieski > 0) && (czerwony == 0)) { suma += itr->first - zielony; //cout << "suma:" << suma <<'\n'; } czerwony++; //cout << "czerwony:" << czerwony <<'\n'; break; case r_czerwony: if ((zolty > 0) && (niebieski > 0) && (czerwony == 1)) { zielony = itr->first; //cout << "zielony:" << zielony <<'\n'; } czerwony--; //cout << "czerwony:" << czerwony <<'\n'; break; default: //jakiś kod break; } } cout << suma <<'\n'; return 0; } |