#include <cstdio> #include <vector> #include <set> using namespace std; int t, n, m, a, b; char c; int main() { scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); vector<vector<int>> winA(n), winB(n), failA(n), failB(n); vector<int> pointsA(n), pointsB(n); set<pair<int, int>> A, B; for(int i = 0; i < m; ++i) { scanf("%d %c%d", &a, &c, &b); --a; --b; if(c == '>') { winA[a].push_back(b); failB[b].push_back(a); } else { failA[a].push_back(b); winB[b].push_back(a); } } for(int i = 0; i < n; ++i) { pointsA[i] += winA[i].size() - failA[i].size(); pointsB[i] += winB[i].size() - failB[i].size(); } for(int i = 0; i < n; ++i) { A.insert(make_pair(pointsA[i], i)); B.insert(make_pair(pointsB[i], i)); } for(int i = 0; i < n - 1; ++i) { auto endB = B.end(); endB--; for(auto &&j : winB[endB->second]) { auto it = A.find(make_pair(pointsA[j], j)); if(it != A.end()) { A.erase(it); ++pointsA[j]; A.insert(make_pair(pointsA[j], j)); } } for(auto &&j : failB[endB->second]) { auto it = A.find(make_pair(pointsA[j], j)); if(it != A.end()) { A.erase(it); --pointsA[j]; A.insert(make_pair(pointsA[j], j)); } } B.erase(endB); auto endA = A.end(); endA--; for(auto &&j : winA[endA->second]) { auto it = B.find(make_pair(pointsB[j], j)); if(it != B.end()) { B.erase(it); ++pointsB[j]; B.insert(make_pair(pointsB[j], j)); } } for(auto &&j : failA[endA->second]) { auto it = B.find(make_pair(pointsB[j], j)); if(it != B.end()) { B.erase(it); --pointsB[j]; B.insert(make_pair(pointsB[j], j)); } } A.erase(endA); } bool temp = false; for(auto &&j : winA[A.begin()->second]) { if(j == B.begin()->second) temp = true; } if(temp) printf("WYGRANA\n"); else { for(auto &&j : failA[A.begin()->second]) { if(j == B.begin()->second) temp = true; } if(temp) printf("PRZEGRANA\n"); else printf("REMIS\n"); } //printf("%d %d\n", A.begin()->second, B.begin()->second); } }
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 | #include <cstdio> #include <vector> #include <set> using namespace std; int t, n, m, a, b; char c; int main() { scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); vector<vector<int>> winA(n), winB(n), failA(n), failB(n); vector<int> pointsA(n), pointsB(n); set<pair<int, int>> A, B; for(int i = 0; i < m; ++i) { scanf("%d %c%d", &a, &c, &b); --a; --b; if(c == '>') { winA[a].push_back(b); failB[b].push_back(a); } else { failA[a].push_back(b); winB[b].push_back(a); } } for(int i = 0; i < n; ++i) { pointsA[i] += winA[i].size() - failA[i].size(); pointsB[i] += winB[i].size() - failB[i].size(); } for(int i = 0; i < n; ++i) { A.insert(make_pair(pointsA[i], i)); B.insert(make_pair(pointsB[i], i)); } for(int i = 0; i < n - 1; ++i) { auto endB = B.end(); endB--; for(auto &&j : winB[endB->second]) { auto it = A.find(make_pair(pointsA[j], j)); if(it != A.end()) { A.erase(it); ++pointsA[j]; A.insert(make_pair(pointsA[j], j)); } } for(auto &&j : failB[endB->second]) { auto it = A.find(make_pair(pointsA[j], j)); if(it != A.end()) { A.erase(it); --pointsA[j]; A.insert(make_pair(pointsA[j], j)); } } B.erase(endB); auto endA = A.end(); endA--; for(auto &&j : winA[endA->second]) { auto it = B.find(make_pair(pointsB[j], j)); if(it != B.end()) { B.erase(it); ++pointsB[j]; B.insert(make_pair(pointsB[j], j)); } } for(auto &&j : failA[endA->second]) { auto it = B.find(make_pair(pointsB[j], j)); if(it != B.end()) { B.erase(it); --pointsB[j]; B.insert(make_pair(pointsB[j], j)); } } A.erase(endA); } bool temp = false; for(auto &&j : winA[A.begin()->second]) { if(j == B.begin()->second) temp = true; } if(temp) printf("WYGRANA\n"); else { for(auto &&j : failA[A.begin()->second]) { if(j == B.begin()->second) temp = true; } if(temp) printf("PRZEGRANA\n"); else printf("REMIS\n"); } //printf("%d %d\n", A.begin()->second, B.begin()->second); } } |