Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <set>
- #include <vector>
- #include <utility>
- #include <cstdio>
- std::multiset<int> suma_multizbiorow(std::multiset<int> multisetA, std::multiset<int> multisetB)
- {
- std::multiset<int> multisetC;
- std::multiset<int>::iterator ptr = multisetA.begin();
- for(unsigned i = 0; i < multisetA.size(); i++)
- {
- multisetC.insert(*ptr);
- ptr++;
- }
- ptr = multisetB.begin();
- for(unsigned i = 0; i < multisetB.size(); i++)
- {
- multisetC.insert(*ptr);
- ptr++;
- }
- return multisetC;
- }
- std::multiset<int> obciecie_multizbioru(std::multiset<int> multisetE, unsigned int rozmiar)
- {
- std::multiset<int> multisetWynikowy;
- std::multiset<int>::iterator ptr = multisetE.begin();
- if( multisetE.size() < rozmiar ) rozmiar = multisetE.size();
- for(unsigned i = 0; i < rozmiar; i++)
- {
- multisetWynikowy.insert( *ptr );
- ptr++;
- }
- return multisetWynikowy;
- }
- int suma_elementow_zbioru(std::multiset<int> multisetA)
- {
- int suma = 0;
- std::multiset<int>::iterator ptr = multisetA.begin();
- for(unsigned i = 0; i < multisetA.size(); i++)
- {
- suma += *ptr;
- ptr++;
- }
- return suma;
- }
- int liczba_roznych_elementow_multizbioru(std::multiset<int> multisetA)
- {
- std::set<int> setA;
- std::multiset<int>::iterator ptr = multisetA.begin();
- for(unsigned i = 0; i < multisetA.size(); i++)
- {
- setA.insert(*ptr);
- ptr++;
- }
- return setA.size();
- }
- std::multiset<int> suma_alternatywna_multizbiorow(std::multiset<int> multisetE, std::multiset<int> multisetF, std::multiset<int> multisetG, int rozmiar)
- {
- std::multiset<int> multisetRoboczy;
- std::multiset<int> multisetWynikowy;
- if( suma_elementow_zbioru(multisetE) % 2 == 0 )
- multisetRoboczy = suma_multizbiorow( multisetE, multisetF );
- else
- multisetRoboczy = suma_multizbiorow( multisetE, multisetG );
- multisetWynikowy = obciecie_multizbioru( multisetRoboczy, rozmiar );
- return multisetWynikowy;
- }
- int main()
- {
- int n, m, k;
- scanf("%d %d %d", &n, &m, &k);
- std::vector<std::multiset<int> > multizbioryX;
- std::vector<std::pair<int, int> > paryIndexow;
- std::multiset<int> multisetRoboczy;
- for(short i = 0; i < n; i++)
- {
- int rozmiarMultizbioru, elementZbioru;
- scanf("%d", &rozmiarMultizbioru);
- for(int j = 0; j < rozmiarMultizbioru; j++)
- {
- scanf("%d", &elementZbioru);
- multisetRoboczy.insert(elementZbioru);
- }
- multizbioryX.push_back( multisetRoboczy );
- multisetRoboczy.clear();
- }
- for(int i = 0; i < k; i++)
- {
- int x, y;
- scanf("%d %d", &x, &y);
- paryIndexow.push_back( std::make_pair(x, y) );
- }
- // A = [ {}, multizbioryX[paryIndexow[ ITERATOR_0_DO_K ].first], multizbioryX[paryIndexow[ ITERATOR_0_DO_K ].second], m]
- std::multiset<int> multizbiorSzukany;
- for(int i = 0; i < k; i++)
- {
- multizbiorSzukany = suma_alternatywna_multizbiorow( multizbiorSzukany , multizbioryX[ paryIndexow[ i ].first ], multizbioryX[paryIndexow[ i ].second], m);
- }
- printf("%d %d", suma_elementow_zbioru(multizbiorSzukany), liczba_roznych_elementow_multizbioru(multizbiorSzukany));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement