#include <stdio.h> #include <set> #include <map> using namespace std; void wypisz(set<int> mr, set<int> jr, map<int,set<int>> mw, map<int,set<int>> jw, map<int,set<int>> mp, map<int,set<int>> jp) { #if defined (DEBUG) printf("\nmr: "); for(auto r : mr) printf("%d ",r); printf("\njr: "); for(auto r : jr) printf("%d ",r); printf("\nmw:\n"); for(auto w : mw) { printf("{%d}-> ",w.first); for(auto i : w.second) printf("%d ",i); printf("\n"); } printf("\njw:\n"); for(auto w : jw) { printf("{%d}-> ",w.first); for(auto i : w.second) printf("%d ",i); } printf("\nmp:\n"); for(auto w : mp) { printf("{%d}-> ",w.first); for(auto i : w.second) printf("%d ",i); } printf("\njp:\n"); for(auto w : jp) { printf("{%d}-> ",w.first); for(auto i : w.second) printf("%d ",i); } printf("\n"); #endif } void usun_strzalke(int ktory, int co, map<int,set<int>> &skad, set<int> &dokad) { if(skad.find(ktory)!=skad.end()) { skad[ktory].erase(co); if(skad[ktory].empty()) { skad.erase(ktory); dokad.insert(ktory); } } } int main() { int t,n,m,a,b; char c; scanf("%d",&t); while(t--) { set<int> mr,jr; map<int,set<int>> mw,mp,jw,jp; scanf("%d%d",&n,&m); //printf("n %d m %d\n",n,m); for(int i=1;i<=n;i++) { mr.insert(i); jr.insert(i); } while(m--) { scanf("%d %c %d",&a,&c,&b); if(c=='<') { mr.erase(a); jr.erase(b); mp[a].insert(b); jw[b].insert(a); } else { mr.erase(a); jr.erase(b); mw[a].insert(b); jp[b].insert(a); } } wypisz(mr,jr,mw,jw,mp,jp); while (jw.size() + jr.size() + jp.size() >1) { // printf("while\n"); if(jw.size()>0) { int w = jw.begin()->first; for( auto i : jw.begin()->second ) usun_strzalke(i,w,mp,mr); for( auto i : jp[w]) usun_strzalke(i, w, mw,mr); jp.erase(w); jw.erase(w); } else if (jr.size()>0) { jr.erase(*jr.begin()); } else if(jp.size()>0) { int w = jp.begin()->first; for( auto i : jp.begin()->second ) usun_strzalke(i,w,mw,mr); for( auto i : jw[w]) usun_strzalke(i,w,mp,mr); jp.erase(w); jw.erase(w); } // else printf("ERROR1\n"); if(mw.size()>0) { int w = mw.begin()->first; for( auto i : mw.begin()->second ) usun_strzalke(i,w,jp,jr); for( auto i : mp[w]) usun_strzalke(i,w,jw,jr); mp.erase(w); mw.erase(w); } else if (mr.size()>0) { mr.erase(*mr.begin()); } else if(mp.size()>0) { int w = mp.begin()->first; for( auto i : mp.begin()->second ) usun_strzalke(i,w,jw,jr); for( auto i : mw[w]) usun_strzalke(i,w,jp,jr); mp.erase(w); mw.erase(w); } // else printf("ERROR2\n"); } wypisz(mr,jr,mw,jw,mp,jp); if(!mw.empty()) { printf("WYGRANA\n"); } else if(!mp.empty()) { printf("PRZEGRANA\n"); } else printf("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 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | #include <stdio.h> #include <set> #include <map> using namespace std; void wypisz(set<int> mr, set<int> jr, map<int,set<int>> mw, map<int,set<int>> jw, map<int,set<int>> mp, map<int,set<int>> jp) { #if defined (DEBUG) printf("\nmr: "); for(auto r : mr) printf("%d ",r); printf("\njr: "); for(auto r : jr) printf("%d ",r); printf("\nmw:\n"); for(auto w : mw) { printf("{%d}-> ",w.first); for(auto i : w.second) printf("%d ",i); printf("\n"); } printf("\njw:\n"); for(auto w : jw) { printf("{%d}-> ",w.first); for(auto i : w.second) printf("%d ",i); } printf("\nmp:\n"); for(auto w : mp) { printf("{%d}-> ",w.first); for(auto i : w.second) printf("%d ",i); } printf("\njp:\n"); for(auto w : jp) { printf("{%d}-> ",w.first); for(auto i : w.second) printf("%d ",i); } printf("\n"); #endif } void usun_strzalke(int ktory, int co, map<int,set<int>> &skad, set<int> &dokad) { if(skad.find(ktory)!=skad.end()) { skad[ktory].erase(co); if(skad[ktory].empty()) { skad.erase(ktory); dokad.insert(ktory); } } } int main() { int t,n,m,a,b; char c; scanf("%d",&t); while(t--) { set<int> mr,jr; map<int,set<int>> mw,mp,jw,jp; scanf("%d%d",&n,&m); //printf("n %d m %d\n",n,m); for(int i=1;i<=n;i++) { mr.insert(i); jr.insert(i); } while(m--) { scanf("%d %c %d",&a,&c,&b); if(c=='<') { mr.erase(a); jr.erase(b); mp[a].insert(b); jw[b].insert(a); } else { mr.erase(a); jr.erase(b); mw[a].insert(b); jp[b].insert(a); } } wypisz(mr,jr,mw,jw,mp,jp); while (jw.size() + jr.size() + jp.size() >1) { // printf("while\n"); if(jw.size()>0) { int w = jw.begin()->first; for( auto i : jw.begin()->second ) usun_strzalke(i,w,mp,mr); for( auto i : jp[w]) usun_strzalke(i, w, mw,mr); jp.erase(w); jw.erase(w); } else if (jr.size()>0) { jr.erase(*jr.begin()); } else if(jp.size()>0) { int w = jp.begin()->first; for( auto i : jp.begin()->second ) usun_strzalke(i,w,mw,mr); for( auto i : jw[w]) usun_strzalke(i,w,mp,mr); jp.erase(w); jw.erase(w); } // else printf("ERROR1\n"); if(mw.size()>0) { int w = mw.begin()->first; for( auto i : mw.begin()->second ) usun_strzalke(i,w,jp,jr); for( auto i : mp[w]) usun_strzalke(i,w,jw,jr); mp.erase(w); mw.erase(w); } else if (mr.size()>0) { mr.erase(*mr.begin()); } else if(mp.size()>0) { int w = mp.begin()->first; for( auto i : mp.begin()->second ) usun_strzalke(i,w,jw,jr); for( auto i : mw[w]) usun_strzalke(i,w,jp,jr); mp.erase(w); mw.erase(w); } // else printf("ERROR2\n"); } wypisz(mr,jr,mw,jw,mp,jp); if(!mw.empty()) { printf("WYGRANA\n"); } else if(!mp.empty()) { printf("PRZEGRANA\n"); } else printf("REMIS\n"); } return 0; } |