ADDED SRM/559-U/1A.cpp Index: SRM/559-U/1A.cpp ================================================================== --- SRM/559-U/1A.cpp +++ SRM/559-U/1A.cpp @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex CMP; + +class HyperKnight { public: + long long countCells(int a_, int b_, int numRows, int numColumns, int K) + { + if(a_>b_) swap(a_,b_); + const LL A=a_, B=b_, W=numRows, H=numColumns; + + LL xx[] = {0, A, B, W-B, W-A, W}; + LL yy[] = {0, A, B, H-B, H-A, H}; + LL dx[] = {+A, +A, -A, -A, +B, +B, -B, -B}; + LL dy[] = {+B, -B, +B, -B, +A, -A, +A, -A}; + + LL cnt = 0; + for(int i=0; i+1 +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 long long& Expected, const long long& 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(_, HyperKnight().countCells(a, b, numRows, numColumns, k));} +int main(){ + +CASE(0) + int a = 2; + int b = 1; + int numRows = 8; + int numColumns = 8; + int k = 4; + long long _ = 20LL; +END +CASE(1) + int a = 3; + int b = 2; + int numRows = 8; + int numColumns = 8; + int k = 2; + long long _ = 16LL; +END +CASE(2) + int a = 1; + int b = 3; + int numRows = 7; + int numColumns = 11; + int k = 0; + long long _ = 0LL; +END +CASE(3) + int a = 3; + int b = 2; + int numRows = 10; + int numColumns = 20; + int k = 8; + long long _ = 56LL; +END +CASE(4) + int a = 1; + int b = 4; + int numRows = 100; + int numColumns = 10; + int k = 6; + long long _ = 564LL; +END +CASE(5) + int a = 2; + int b = 3; + int numRows = 1000000000; + int numColumns = 1000000000; + int k = 8; + long long _ = 999999988000000036LL; +END +/* +CASE(6) + int a = ; + int b = ; + int numRows = ; + int numColumns = ; + int k = ; + long long _ = LL; +END +CASE(7) + int a = ; + int b = ; + int numRows = ; + int numColumns = ; + int k = ; + long long _ = LL; +END +*/ +} +// END CUT HERE ADDED SRM/559-U/1B.cpp Index: SRM/559-U/1B.cpp ================================================================== --- SRM/559-U/1B.cpp +++ SRM/559-U/1B.cpp @@ -0,0 +1,152 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex CMP; + +typedef int vert; +typedef vector< vector > graph; + +class HatRack { public: + long long countWays(vector knob1, vector knob2) + { + int N = knob1.size() + 1; + graph G(N); + for(int i=0; i memo; + LL rec(const graph& G, const int N, int pre, int cur, int loc) { + int key = (pre*N+cur)*N+(loc-1); + if(memo[key] != -1) + return memo[key]; + + vector e_child; + if(loc*2+0 <= N) e_child.push_back(loc*2+0); + if(loc*2+1 <= N) e_child.push_back(loc*2+1); + + vector r_child; + for(int i=0; i +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 long long& Expected, const long long& 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(_, HatRack().countWays(knob1, knob2));} +int main(){ + +CASE(0) + int knob1_[] = {1}; + vector knob1(knob1_, knob1_+sizeof(knob1_)/sizeof(*knob1_)); + int knob2_[] = {2}; + vector knob2(knob2_, knob2_+sizeof(knob2_)/sizeof(*knob2_)); + long long _ = 2LL; +END +CASE(1) + int knob1_[] = {1,1}; + vector knob1(knob1_, knob1_+sizeof(knob1_)/sizeof(*knob1_)); + int knob2_[] = {2,3}; + vector knob2(knob2_, knob2_+sizeof(knob2_)/sizeof(*knob2_)); + long long _ = 2LL; +END +CASE(2) + int knob1_[] = {1,1,1,1}; + vector knob1(knob1_, knob1_+sizeof(knob1_)/sizeof(*knob1_)); + int knob2_[] = {2,3,4,5}; + vector knob2(knob2_, knob2_+sizeof(knob2_)/sizeof(*knob2_)); + long long _ = 0LL; +END +CASE(3) + int knob1_[] = {6,6,6,4,1}; + vector knob1(knob1_, knob1_+sizeof(knob1_)/sizeof(*knob1_)); + int knob2_[] = {1,2,4,5,3}; + vector knob2(knob2_, knob2_+sizeof(knob2_)/sizeof(*knob2_)); + long long _ = 0LL; +END +CASE(4) + int knob1_[] = {1,1,2,2,11,11,8,8,3,3,4,4,5}; + vector knob1(knob1_, knob1_+sizeof(knob1_)/sizeof(*knob1_)); + int knob2_[] = {2,3,11,8,12,13,9,10,4,5,7,6,14}; + vector knob2(knob2_, knob2_+sizeof(knob2_)/sizeof(*knob2_)); + long long _ = 16LL; +END +CASE(5) + int knob1_[] = {1,2,3,4,5,6,7,8,9}; + vector knob1(knob1_, knob1_+sizeof(knob1_)/sizeof(*knob1_)); + int knob2_[] = {2,3,4,5,6,7,8,9,10}; + vector knob2(knob2_, knob2_+sizeof(knob2_)/sizeof(*knob2_)); + long long _ = 0LL; +END +/* +CASE(6) + int knob1_[] = ; + vector knob1(knob1_, knob1_+sizeof(knob1_)/sizeof(*knob1_)); + int knob2_[] = ; + vector knob2(knob2_, knob2_+sizeof(knob2_)/sizeof(*knob2_)); + long long _ = LL; +END +CASE(7) + int knob1_[] = ; + vector knob1(knob1_, knob1_+sizeof(knob1_)/sizeof(*knob1_)); + int knob2_[] = ; + vector knob2(knob2_, knob2_+sizeof(knob2_)/sizeof(*knob2_)); + long long _ = LL; +END +*/ +} +// END CUT HERE ADDED SRM/559-U/1C-U.cpp Index: SRM/559-U/1C-U.cpp ================================================================== --- SRM/559-U/1C-U.cpp +++ SRM/559-U/1C-U.cpp @@ -0,0 +1,200 @@ +#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; + +struct Circle { + CMP o; + double r; +}; + +bool line_circle(CMP la, CMP lb, CMP c, double r, CMP* p1, CMP* p2) +{ + CMP v = (lb-la) / abs(lb-la); + CMP o = (c-la) / v; + if( abs(o.imag()) > r ) + return false; + double dx = sqrt(r*r - o.imag()*o.imag()); + *p1 = la + (o.real()-dx)*v; + *p2 = la + (o.real()+dx)*v; + return true; +} + +class CircusTents { public: + double findMaximumDistance(vector x, vector y, vector r) + { + double f = r[0]; + + vector cs; + for(int i=1; i& cs) + { + vector args; + + for(int i=0; i aaR) { + theA = M_PI; + } else { + theA = (abs(aaL)>abs(aaR) ? aaL : aaR); + } + + // distance from polar(1.0, theA) to Circ((abs(v),0), cs[close].r) + // ... avoiding the two circle! + double ddd = 0; +cerr< +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 double& Expected, const double& Received) { + bool ok = (abs(Expected - Received) < 1e-9); + 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(_, CircusTents().findMaximumDistance(x, y, r));} +int main(){ + +CASE(0) + int x_[] = {0,3}; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = {0,0}; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int r_[] = {1,1}; + vector r(r_, r_+sizeof(r_)/sizeof(*r_)); + double _ = 3.7390603609952078; +END +CASE(1) + int x_[] = {0,3,-3,3,-3}; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = {0,3,3,-3,-3}; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int r_[] = {1,1,1,1,1}; + vector r(r_, r_+sizeof(r_)/sizeof(*r_)); + double _ = 2.6055512754639887; +END +CASE(2) + int x_[] = {3,7,7,7,3}; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = {4,6,1,-3,0}; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int r_[] = {2,2,2,1,1}; + vector r(r_, r_+sizeof(r_)/sizeof(*r_)); + double _ = 4.3264459099620725; +END +CASE(3) + int x_[] = {10,-1}; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = {0,0}; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int r_[] = {8,2}; + vector r(r_, r_+sizeof(r_)/sizeof(*r_)); + double _ = 24.63092458664212; +END +CASE(4) + int x_[] = {0,4,-4}; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = {0,4,-4}; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int r_[] = {1,1,1}; + vector r(r_, r_+sizeof(r_)/sizeof(*r_)); + double _ = 4.745474963675133; +END +/* +CASE(5) + int x_[] = ; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = ; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int r_[] = ; + vector r(r_, r_+sizeof(r_)/sizeof(*r_)); + double _ = ; +END +CASE(6) + int x_[] = ; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = ; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int r_[] = ; + vector r(r_, r_+sizeof(r_)/sizeof(*r_)); + double _ = ; +END +*/ +} +// END CUT HERE