#include<iostream> #include<vector> #include<algorithm> #include<queue> #include<set> using namespace std; const int N=100002; int n, i, t, m, a, b, IleBajtek, IleBitek, ilosc; char w; int Bajtek[N], Bitek[N], WchBitek[N], WchBajtek[N];//Bajtek[i] - ilosc krawedzi wychodzacych z Bajtka i vector<int> Ba[N],Bi[N];//Ba[i] - wierzcholki Bajtka wchodzace do i struct cmp1 { // czy a jest mniejsze od b bool operator() (const int a, const int b) { if (Bajtek[a] > Bajtek[b]) return true; if (Bajtek[a] < Bajtek[b]) return false; if (WchBajtek[a] < WchBajtek[b]) return true; if (WchBajtek[a] > WchBajtek[b]) return false; return b < a; } }; struct cmp2 { // czy a jest mniejsze od b bool operator() (const int a, const int b) { if (Bitek[a] > Bitek[b]) return true; if (Bitek[a] < Bitek[b]) return false; if (WchBitek[a] < WchBitek[b]) return true; if (WchBitek[a] > WchBitek[b]) return false; return b < a; } }; set<int, cmp1> SetBa;//na poczatku wierzcholki Bajtka o najwiekszej ilosci krawedzi wychodzacych set<int, cmp2> SetBi; int main() { ios_base::sync_with_stdio(0); cin >> t; while(t--){ cin >> n >> m; //if (t == 8) cout << n <<" " << m <<endl; SetBa.clear();SetBi.clear(); for(i = 1; i <= n; ++i) { Bajtek[i] = Bitek[i] = WchBajtek[i] = WchBitek[i] = 0; Ba[i].clear(); Bi[i].clear();} for(i = 0; i < m; ++i) { cin >> a >> w >> b; //if(t == 8) cout << a <<" "<< w <<" "<< b << endl; if(w == '>') {Bajtek[a]++;Ba[b].push_back(a);WchBitek[b]++;} else {Bitek[b]++;Bi[a].push_back(b);WchBajtek[a]++; } } IleBajtek = 0; IleBitek = 0; for(i = 1; i <= n; ++i) { if(Bajtek[i] > 0) {IleBajtek++;} if(Bitek[i] > 0) {IleBitek++;} SetBa.insert(i); SetBi.insert(i); } if(IleBajtek == n) { while(SetBa.size()>1){ int w = *(SetBi.begin()); //cout <<"Bajtek usuwa " << w << endl; SetBi.erase(SetBi.begin()); for(i=0;i<Ba[w].size();++i) { WchBitek[w]--; int v = Ba[w][i]; if(SetBa.find(v) != SetBa.end()) { SetBa.erase(SetBa.find(v)); Bajtek[v]--; SetBa.insert(v); } else Bajtek[v]--; } int z = *(SetBa.begin()); //cout <<"Bitek usuwa " << z << endl; SetBa.erase(SetBa.begin()); for(i=0;i<Bi[z].size();++i) { WchBajtek[z]--; int y = Bi[z][i]; if(SetBi.find(y) != SetBi.end()) { SetBi.erase(SetBi.find(y)); Bitek[y]--; SetBi.insert(y); } else Bitek[y]--; } } int ZostalBa = *(SetBa.begin()), ZostalBi = *(SetBi.begin()); //cout<<*(SetBa.begin()) << endl << *(SetBi.begin()) << endl; bool Wygrana = false, Przegrana = false; //if(Bitek[ZostalBi] > 0) { for(i=0; i < Bi[ZostalBa].size();++i) if(Bi[ZostalBa][i] == ZostalBi) Przegrana = true; } //if(Bajtek[ZostalBa] > 0) { for(i=0; i < Ba[ZostalBi].size();++i) if(Ba[ZostalBi][i] == ZostalBa) Wygrana = true; } if(Wygrana) cout <<"WYGRANA\n"; else if(Przegrana) cout<<"PRZEGRANA\n"; else cout <<"REMIS\n"; } else if(IleBitek == n) { cout<<"PRZEGRANA\n"; } else cout <<"REMIS\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 116 117 118 119 | #include<iostream> #include<vector> #include<algorithm> #include<queue> #include<set> using namespace std; const int N=100002; int n, i, t, m, a, b, IleBajtek, IleBitek, ilosc; char w; int Bajtek[N], Bitek[N], WchBitek[N], WchBajtek[N];//Bajtek[i] - ilosc krawedzi wychodzacych z Bajtka i vector<int> Ba[N],Bi[N];//Ba[i] - wierzcholki Bajtka wchodzace do i struct cmp1 { // czy a jest mniejsze od b bool operator() (const int a, const int b) { if (Bajtek[a] > Bajtek[b]) return true; if (Bajtek[a] < Bajtek[b]) return false; if (WchBajtek[a] < WchBajtek[b]) return true; if (WchBajtek[a] > WchBajtek[b]) return false; return b < a; } }; struct cmp2 { // czy a jest mniejsze od b bool operator() (const int a, const int b) { if (Bitek[a] > Bitek[b]) return true; if (Bitek[a] < Bitek[b]) return false; if (WchBitek[a] < WchBitek[b]) return true; if (WchBitek[a] > WchBitek[b]) return false; return b < a; } }; set<int, cmp1> SetBa;//na poczatku wierzcholki Bajtka o najwiekszej ilosci krawedzi wychodzacych set<int, cmp2> SetBi; int main() { ios_base::sync_with_stdio(0); cin >> t; while(t--){ cin >> n >> m; //if (t == 8) cout << n <<" " << m <<endl; SetBa.clear();SetBi.clear(); for(i = 1; i <= n; ++i) { Bajtek[i] = Bitek[i] = WchBajtek[i] = WchBitek[i] = 0; Ba[i].clear(); Bi[i].clear();} for(i = 0; i < m; ++i) { cin >> a >> w >> b; //if(t == 8) cout << a <<" "<< w <<" "<< b << endl; if(w == '>') {Bajtek[a]++;Ba[b].push_back(a);WchBitek[b]++;} else {Bitek[b]++;Bi[a].push_back(b);WchBajtek[a]++; } } IleBajtek = 0; IleBitek = 0; for(i = 1; i <= n; ++i) { if(Bajtek[i] > 0) {IleBajtek++;} if(Bitek[i] > 0) {IleBitek++;} SetBa.insert(i); SetBi.insert(i); } if(IleBajtek == n) { while(SetBa.size()>1){ int w = *(SetBi.begin()); //cout <<"Bajtek usuwa " << w << endl; SetBi.erase(SetBi.begin()); for(i=0;i<Ba[w].size();++i) { WchBitek[w]--; int v = Ba[w][i]; if(SetBa.find(v) != SetBa.end()) { SetBa.erase(SetBa.find(v)); Bajtek[v]--; SetBa.insert(v); } else Bajtek[v]--; } int z = *(SetBa.begin()); //cout <<"Bitek usuwa " << z << endl; SetBa.erase(SetBa.begin()); for(i=0;i<Bi[z].size();++i) { WchBajtek[z]--; int y = Bi[z][i]; if(SetBi.find(y) != SetBi.end()) { SetBi.erase(SetBi.find(y)); Bitek[y]--; SetBi.insert(y); } else Bitek[y]--; } } int ZostalBa = *(SetBa.begin()), ZostalBi = *(SetBi.begin()); //cout<<*(SetBa.begin()) << endl << *(SetBi.begin()) << endl; bool Wygrana = false, Przegrana = false; //if(Bitek[ZostalBi] > 0) { for(i=0; i < Bi[ZostalBa].size();++i) if(Bi[ZostalBa][i] == ZostalBi) Przegrana = true; } //if(Bajtek[ZostalBa] > 0) { for(i=0; i < Ba[ZostalBi].size();++i) if(Ba[ZostalBi][i] == ZostalBa) Wygrana = true; } if(Wygrana) cout <<"WYGRANA\n"; else if(Przegrana) cout<<"PRZEGRANA\n"; else cout <<"REMIS\n"; } else if(IleBitek == n) { cout<<"PRZEGRANA\n"; } else cout <<"REMIS\n"; } return 0; } |