#include <iostream> #include <vector> #include <algorithm> #include <ctime> #include <set> using namespace std; vector <int> szef,lud,komp; //--------- vector <set<int>>boss; int find(int a) { if(szef[a]==a) return a; int b=find(szef[a]); boss[szef[a]].erase(a); szef[a]=b; boss[szef[a]].insert(a); return szef[a]; } void onion(int a,int b) { int c=find(a),d=find(b); if(c==d) { komp[c]++; return; } if(rand()%2==1) { int x=c; c=d; d=x; } szef[d]=c; boss[c].insert(d); komp[c]+=komp[d]+1; lud[c]+=lud[d]; } int main() { srand(time(NULL)); cin.tie(0)->sync_with_stdio(false); int n,q; cin>>n>>q; szef.resize(n); lud.resize(n); komp.resize(n); boss.resize(n); for(int i=0;i<n;i++) { szef[i]=i; lud[i]=1; komp[i]=0; boss[i].clear(); } for(int i=0;i<q;i++) { int a,b; char bubus; cin>>bubus; if(bubus=='+') { cin>>a>>b; a--; b--; onion(a,b); } if(bubus=='?') { cin>>a; a--; b=find(a); if(komp[b]==0) cout<<0; else { if(komp[b]==lud[b]) cout<<1; else cout<<"?"; } } if(bubus=='-') { cin>>a; a--; b=find(a); if(a==b&&boss[a].size()!=0) { b=*boss[a].begin(); lud[b]=lud[a]; komp[b]=komp[a]; szef[b]=b; } set<int>:: iterator itr; for(itr=boss[a].begin();itr!=boss[a].end();itr++) { szef[*itr]=b; if(*itr!=b) boss[b].insert(*itr); } boss[b].erase(a); lud[b]--; komp[b]--; szef[a]=a; lud[a]=1; komp[a]=0; boss[a].clear(); } } }
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 | #include <iostream> #include <vector> #include <algorithm> #include <ctime> #include <set> using namespace std; vector <int> szef,lud,komp; //--------- vector <set<int>>boss; int find(int a) { if(szef[a]==a) return a; int b=find(szef[a]); boss[szef[a]].erase(a); szef[a]=b; boss[szef[a]].insert(a); return szef[a]; } void onion(int a,int b) { int c=find(a),d=find(b); if(c==d) { komp[c]++; return; } if(rand()%2==1) { int x=c; c=d; d=x; } szef[d]=c; boss[c].insert(d); komp[c]+=komp[d]+1; lud[c]+=lud[d]; } int main() { srand(time(NULL)); cin.tie(0)->sync_with_stdio(false); int n,q; cin>>n>>q; szef.resize(n); lud.resize(n); komp.resize(n); boss.resize(n); for(int i=0;i<n;i++) { szef[i]=i; lud[i]=1; komp[i]=0; boss[i].clear(); } for(int i=0;i<q;i++) { int a,b; char bubus; cin>>bubus; if(bubus=='+') { cin>>a>>b; a--; b--; onion(a,b); } if(bubus=='?') { cin>>a; a--; b=find(a); if(komp[b]==0) cout<<0; else { if(komp[b]==lud[b]) cout<<1; else cout<<"?"; } } if(bubus=='-') { cin>>a; a--; b=find(a); if(a==b&&boss[a].size()!=0) { b=*boss[a].begin(); lud[b]=lud[a]; komp[b]=komp[a]; szef[b]=b; } set<int>:: iterator itr; for(itr=boss[a].begin();itr!=boss[a].end();itr++) { szef[*itr]=b; if(*itr!=b) boss[b].insert(*itr); } boss[b].erase(a); lud[b]--; komp[b]--; szef[a]=a; lud[a]=1; komp[a]=0; boss[a].clear(); } } } |