#include<iostream> #include<set> #include<vector> using namespace std; int srcV[40005], srcX[100005], srcY[100005], wskXY; int n, ms, md, a, b; set<pair<int, int> > src, dst, pow; int nast; pair<int, int> do_wst; vector<string> wynik; void wstaw(int a, int b) { ++wskXY; srcX[wskXY] = b; srcY[wskXY] = srcV[a]; srcV[a] = wskXY; } void do_pow(pair<int, int> x) { nast = srcV[x.second]; while(nast) { if(srcX[nast] != x.first) { if(x.first < srcX[nast]) pow.insert(make_pair(x.first, srcX[nast])); else pow.insert(make_pair(srcX[nast], x.first)); } nast = srcY[nast]; } nast = srcV[x.first]; while(nast) { if(srcX[nast] != x.second){ if(x.second < srcX[nast]) pow.insert(make_pair(x.second, srcX[nast])); else pow.insert(make_pair(srcX[nast], x.second)); } nast = srcY[nast]; } } int main() { ios_base::sync_with_stdio(0); cin >> n; cin >> ms; for(int i = 0; i < ms; ++i) { cin >> a >> b; if(a < b) src.insert(make_pair(a, b)); else src.insert(make_pair(b, a)); wstaw(a, b); wstaw(b, a); } cin >> md; for(int i = 0; i < md; ++i) { cin >> a >> b; if(a < b) dst.insert(make_pair(a, b)); else dst.insert(make_pair(b, a)); } for (auto& x : src) { do_pow(x); } //Braki for (auto& x : dst) { if(src.find(x) == src.end()) { if(pow.find(x) == pow.end()) { if(srcX[srcV[x.first]] < x.second) do_wst = make_pair(srcX[srcV[x.first]], x.second); else do_wst = make_pair(x.second, srcX[srcV[x.first]]); src.insert(do_wst); wstaw(do_wst.first, do_wst.second); wstaw(do_wst.second, do_wst.first); do_pow(do_wst); wynik.push_back("+ " + to_string(do_wst.first) + " " + to_string(do_wst.second)); } src.insert(x); wstaw(x.first, x.second); wstaw(x.second, x.first); do_pow(x); wynik.push_back("+ " + to_string(x.first) + " " + to_string(x.second)); } } //Do usuniecia for (auto& x : src) { if(dst.find(x) == dst.end()) { wynik.push_back("- " + to_string(x.first) + " " + to_string(x.second)); } } cout << wynik.size() << endl; for(auto& x : wynik) { cout << x << endl; } 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 | #include<iostream> #include<set> #include<vector> using namespace std; int srcV[40005], srcX[100005], srcY[100005], wskXY; int n, ms, md, a, b; set<pair<int, int> > src, dst, pow; int nast; pair<int, int> do_wst; vector<string> wynik; void wstaw(int a, int b) { ++wskXY; srcX[wskXY] = b; srcY[wskXY] = srcV[a]; srcV[a] = wskXY; } void do_pow(pair<int, int> x) { nast = srcV[x.second]; while(nast) { if(srcX[nast] != x.first) { if(x.first < srcX[nast]) pow.insert(make_pair(x.first, srcX[nast])); else pow.insert(make_pair(srcX[nast], x.first)); } nast = srcY[nast]; } nast = srcV[x.first]; while(nast) { if(srcX[nast] != x.second){ if(x.second < srcX[nast]) pow.insert(make_pair(x.second, srcX[nast])); else pow.insert(make_pair(srcX[nast], x.second)); } nast = srcY[nast]; } } int main() { ios_base::sync_with_stdio(0); cin >> n; cin >> ms; for(int i = 0; i < ms; ++i) { cin >> a >> b; if(a < b) src.insert(make_pair(a, b)); else src.insert(make_pair(b, a)); wstaw(a, b); wstaw(b, a); } cin >> md; for(int i = 0; i < md; ++i) { cin >> a >> b; if(a < b) dst.insert(make_pair(a, b)); else dst.insert(make_pair(b, a)); } for (auto& x : src) { do_pow(x); } //Braki for (auto& x : dst) { if(src.find(x) == src.end()) { if(pow.find(x) == pow.end()) { if(srcX[srcV[x.first]] < x.second) do_wst = make_pair(srcX[srcV[x.first]], x.second); else do_wst = make_pair(x.second, srcX[srcV[x.first]]); src.insert(do_wst); wstaw(do_wst.first, do_wst.second); wstaw(do_wst.second, do_wst.first); do_pow(do_wst); wynik.push_back("+ " + to_string(do_wst.first) + " " + to_string(do_wst.second)); } src.insert(x); wstaw(x.first, x.second); wstaw(x.second, x.first); do_pow(x); wynik.push_back("+ " + to_string(x.first) + " " + to_string(x.second)); } } //Do usuniecia for (auto& x : src) { if(dst.find(x) == dst.end()) { wynik.push_back("- " + to_string(x.first) + " " + to_string(x.second)); } } cout << wynik.size() << endl; for(auto& x : wynik) { cout << x << endl; } return 0; } |