#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; } |
English