ADDED SRM/597-U/1A.cpp Index: SRM/597-U/1A.cpp ================================================================== --- SRM/597-U/1A.cpp +++ SRM/597-U/1A.cpp @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef complex CMP; + +class LittleElephantAndString { public: + int getNumber(string A, string B) + { + string AA = A, BB = B; + sort(AA.begin(), AA.end()); + sort(BB.begin(), BB.end()); + if(AA != BB) + return -1; + for(int n=0; n +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template ostream& operator<<(ostream& os, const vector& v) + { os << "{ "; + for(typename vector::const_iterator it=v.begin(); it!=v.end(); ++it) + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } +void verify_case(const int& Expected, const int& Received) { + bool ok = (Expected == Received); + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); +#define END verify_case(_, LittleElephantAndString().getNumber(A, B));} +int main(){ + +CASE(0) + string A = "ABC"; + string B = "CBA"; + int _ = 2; +END +CASE(1) + string A = "A"; + string B = "B"; + int _ = -1; +END +CASE(2) + string A = "AAABBB"; + string B = "BBBAAA"; + int _ = 3; +END +CASE(3) + string A = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + string B = "ZYXWVUTSRQPONMLKJIHGFEDCBA"; + int _ = 25; +END +CASE(4) + string A = "A"; + string B = "A"; + int _ = 0; +END +CASE(5) + string A = "DCABA"; + string B = "DACBA"; + int _ = 2; +END +/* +CASE(6) + string A = ; + string B = ; + int _ = ; +END +CASE(7) + string A = ; + string B = ; + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/597-U/1B.cpp Index: SRM/597-U/1B.cpp ================================================================== --- SRM/597-U/1B.cpp +++ SRM/597-U/1B.cpp @@ -0,0 +1,220 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef complex CMP; + +LL gcd(LL a, LL b) +{ + while(a) + swap(a, b%=a); + return b; +} + +class ConvexPolygonGame { public: + string winner(vector X, vector Y) + { + return has_int_triangle(X, Y) ? "Masha" : "Petya"; + } + + bool has_int_triangle(const vector& X, const vector& Y) + { + const int xm = *min_element(X.begin(), X.end()); + const int xM = *max_element(X.begin(), X.end()); + + vector< pair > p; + + int nc = 0, two = 0, dis = 0; + for(int x=xm; x<=xM; ++x) + { + int ym, yM; + tie(ym, yM) = y_range(x, X, Y); + if(ym <= yM) { + dis ++; + nc += (yM - ym + 1); + if(yM-ym+1 >= 2) + two ++; + else + p.emplace_back(x, ym); + } +// cerr << nc << "," << two << " : " << x << " " << ym << " ~ " << yM << endl; + if(nc>=3 && two>=1 && dis>=2) + return true; + } + if(nc>=3 && two==0 && dis>=2) + { + double am, aM; + for(int i=1; i 1e-9; + } + return false; + } + + tuple y_range(int x, const vector& X, const vector& Y) + { + vector< pair > cross; + vector< pair > exact; + + const int N = X.size(); + for(int i=0; i x2) + swap(x1, x2), swap(y1, y2); + + if(x1 == x2) + { + if(x == x1) { + cross.emplace_back(y1,1); + cross.emplace_back(y2,1); + exact.emplace_back(y1,1); + exact.emplace_back(y2,1); + } + } + else + { + if(x q2*d1) + swap(q1,q2), swap(d1,d2); + int ym = ceil_div(q1, d1); + int yM = floor_div(q2, d2); + bool ym_exact = false, yM_exact = false; + for(int i=0; i=0) return int(a/b); + return int(-((-a+b-1)/b)); + } + + static int ceil_div(LL a, LL b) + { + if(a>=0) return int((a+b-1)/b); + return int(-((-a)/b)); + } +}; + +// BEGIN CUT HERE +#include +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template ostream& operator<<(ostream& os, const vector& v) + { os << "{ "; + for(typename vector::const_iterator it=v.begin(); it!=v.end(); ++it) + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } +void verify_case(const string& Expected, const string& Received) { + bool ok = (Expected == Received); + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); +#define END verify_case(_, ConvexPolygonGame().winner(X, Y));} +int main(){ + +CASE(0) + int X_[] = {0, 1, 0}; + vector X(X_, X_+sizeof(X_)/sizeof(*X_)); + int Y_[] = {0, 0, 1}; + vector Y(Y_, Y_+sizeof(Y_)/sizeof(*Y_)); + string _ = "Petya"; +END +CASE(1) + int X_[] = {0, 4, 2}; + vector X(X_, X_+sizeof(X_)/sizeof(*X_)); + int Y_[] = {0, 0, 2}; + vector Y(Y_, Y_+sizeof(Y_)/sizeof(*Y_)); + string _ = "Masha"; +END +CASE(2) + int X_[] = {0, 100, 100, 0}; + vector X(X_, X_+sizeof(X_)/sizeof(*X_)); + int Y_[] = {0, 0, 100, 100}; + vector Y(Y_, Y_+sizeof(Y_)/sizeof(*Y_)); + string _ = "Masha"; +END +CASE(3) + int X_[] = {0, 50, 100, 50}; + vector X(X_, X_+sizeof(X_)/sizeof(*X_)); + int Y_[] = {0, -1, 0, 1}; + vector Y(Y_, Y_+sizeof(Y_)/sizeof(*Y_)); + string _ = "Petya"; +END +CASE(4) + int X_[] = {-100000, 100000, 100000, -100000}; + vector X(X_, X_+sizeof(X_)/sizeof(*X_)); + int Y_[] = {-1, -1, 1, 1}; + vector Y(Y_, Y_+sizeof(Y_)/sizeof(*Y_)); + string _ = "Masha"; +END +CASE(5) + // 1 1 1 (yoko) + int X_[] = {0, 3, 5, 3}; + vector X(X_, X_+sizeof(X_)/sizeof(*X_)); + int Y_[] = {0, 0, 1, 1}; + vector Y(Y_, Y_+sizeof(Y_)/sizeof(*Y_)); + string _ = "Masha"; +END +CASE(5) + // 1 1 1 (tate) + int X_[] = {0, 1, 1, 0}; + vector X(X_, X_+sizeof(X_)/sizeof(*X_)); + int Y_[] = {0, 3, 5, 3}; + vector Y(Y_, Y_+sizeof(Y_)/sizeof(*Y_)); + string _ = "Masha"; +END +CASE(6) + // 3 (tate) // yoko ha sample + int X_[] = {-1, 0, 1, 0}; + vector X(X_, X_+sizeof(X_)/sizeof(*X_)); + int Y_[] = {0, -2, 0, 2}; + vector Y(Y_, Y_+sizeof(Y_)/sizeof(*Y_)); + string _ = "Petya"; +END +} +// END CUT HERE