#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
struct Klaster {
int l_mieszk;
int l_kompow;
// int cel; -- osobny wektor zeby szybciej szukac.
};
struct Stan {
std::vector< int > mieszkancy;
std::vector< Klaster > klastry;
std::vector< int > cele;
Stan(size_t sz) : mieszkancy(sz, -1)
{
}
};
int daj_klaster(int A, Stan& s) {
if (s.mieszkancy[A] == -1) {
int poz = s.klastry.size();
s.klastry.emplace_back( Klaster{ 1, 0 } );
s.cele.emplace_back(poz);
s.mieszkancy[A] = poz;
}
return s.mieszkancy[A];
}
int idz_do_lidera(int A, Stan& s) {
std::vector< int > path;
while (s.cele[A] != A) {
path.push_back(A);
A = s.cele[A];
}
for (auto el : path) {
s.cele[el] = A;
}
return A;
}
void wstaw(int A, int B, Stan& s) {
int kA = daj_klaster(A, s);
int kB = daj_klaster(B, s);
int lider_kA = idz_do_lidera(kA, s);
int lider_kB = idz_do_lidera(kB, s);
int lepszy = (s.klastry[lider_kA].l_mieszk < s.klastry[lider_kB].l_mieszk) ? lider_kB : lider_kA;
int gorszy = (s.klastry[lider_kA].l_mieszk < s.klastry[lider_kB].l_mieszk) ? lider_kA : lider_kB;
s.klastry[lepszy].l_kompow += 1;
if (lepszy != gorszy) {
s.klastry[lepszy].l_mieszk += s.klastry[gorszy].l_mieszk;
s.klastry[lepszy].l_kompow += s.klastry[gorszy].l_kompow;
s.cele[gorszy] = lepszy;
}
}
void wywal(int A, Stan& s) {
int kA = idz_do_lidera(s.mieszkancy[A], s);
s.klastry[kA].l_mieszk -= 1;
s.klastry[kA].l_kompow -= 1;
s.mieszkancy[A] = -1;
}
char pytaj(int A, Stan& s) {
if (s.mieszkancy[A] == -1) {
return '0';
}
int kA = idz_do_lidera(s.mieszkancy[A], s);
Klaster const& k = s.klastry[kA];
if (k.l_kompow == 0) {
return '0';
}
else if (k.l_mieszk == k.l_kompow) {
return '1';
}
else {
return '?';
}
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
size_t l_mieszk; std::cin >> l_mieszk;
size_t l_zdarzen; std::cin >> l_zdarzen;
Stan s(l_mieszk);
for (size_t i = 0; i < l_zdarzen; ++i) {
char typ_zd; std::cin >> typ_zd;
if (typ_zd == '+') {
int A; int B; std::cin >> A >> B; A--; B--;
wstaw(A, B, s);
}
else if (typ_zd == '-') {
int A; std::cin >> A; A--;
wywal(A, s);
}
else if (typ_zd == '?') {
int A; std::cin >> A; A--;
std::cout << pytaj(A, s);
}
}
std::cout << "\n";
}
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 116 117 118 119 120 121 122 | #include <algorithm> #include <iostream> #include <iterator> #include <string> #include <vector> struct Klaster { int l_mieszk; int l_kompow; // int cel; -- osobny wektor zeby szybciej szukac. }; struct Stan { std::vector< int > mieszkancy; std::vector< Klaster > klastry; std::vector< int > cele; Stan(size_t sz) : mieszkancy(sz, -1) { } }; int daj_klaster(int A, Stan& s) { if (s.mieszkancy[A] == -1) { int poz = s.klastry.size(); s.klastry.emplace_back( Klaster{ 1, 0 } ); s.cele.emplace_back(poz); s.mieszkancy[A] = poz; } return s.mieszkancy[A]; } int idz_do_lidera(int A, Stan& s) { std::vector< int > path; while (s.cele[A] != A) { path.push_back(A); A = s.cele[A]; } for (auto el : path) { s.cele[el] = A; } return A; } void wstaw(int A, int B, Stan& s) { int kA = daj_klaster(A, s); int kB = daj_klaster(B, s); int lider_kA = idz_do_lidera(kA, s); int lider_kB = idz_do_lidera(kB, s); int lepszy = (s.klastry[lider_kA].l_mieszk < s.klastry[lider_kB].l_mieszk) ? lider_kB : lider_kA; int gorszy = (s.klastry[lider_kA].l_mieszk < s.klastry[lider_kB].l_mieszk) ? lider_kA : lider_kB; s.klastry[lepszy].l_kompow += 1; if (lepszy != gorszy) { s.klastry[lepszy].l_mieszk += s.klastry[gorszy].l_mieszk; s.klastry[lepszy].l_kompow += s.klastry[gorszy].l_kompow; s.cele[gorszy] = lepszy; } } void wywal(int A, Stan& s) { int kA = idz_do_lidera(s.mieszkancy[A], s); s.klastry[kA].l_mieszk -= 1; s.klastry[kA].l_kompow -= 1; s.mieszkancy[A] = -1; } char pytaj(int A, Stan& s) { if (s.mieszkancy[A] == -1) { return '0'; } int kA = idz_do_lidera(s.mieszkancy[A], s); Klaster const& k = s.klastry[kA]; if (k.l_kompow == 0) { return '0'; } else if (k.l_mieszk == k.l_kompow) { return '1'; } else { return '?'; } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); size_t l_mieszk; std::cin >> l_mieszk; size_t l_zdarzen; std::cin >> l_zdarzen; Stan s(l_mieszk); for (size_t i = 0; i < l_zdarzen; ++i) { char typ_zd; std::cin >> typ_zd; if (typ_zd == '+') { int A; int B; std::cin >> A >> B; A--; B--; wstaw(A, B, s); } else if (typ_zd == '-') { int A; std::cin >> A; A--; wywal(A, s); } else if (typ_zd == '?') { int A; std::cin >> A; A--; std::cout << pytaj(A, s); } } std::cout << "\n"; } |
English