ADDED SRM/567-U/1A-U.cpp Index: SRM/567-U/1A-U.cpp ================================================================== --- SRM/567-U/1A-U.cpp +++ SRM/567-U/1A-U.cpp @@ -0,0 +1,117 @@ +#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 TheSquareRootDilemma { public: + int countPairs(int N, int M) + { + static const int X = 279; + vector isp(X+1, true); + vector ps; + for(int p=2; p<=X; ++p) + if( isp[p] ) { + ps.push_back(p); + for(int q=p+p; q<=X; q+=p) + isp[q] = false; + } + + map, int> AA; + for(int A=1; A<=N; ++A) + { + int x = A; + vector v; + for(int i=0; i v; + 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 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(_, TheSquareRootDilemma().countPairs(N, M));} +int main(){ + +CASE(0) + int N = 2; + int M = 2; + int _ = 2; +END +CASE(1) + int N = 10; + int M = 1; + int _ = 3; +END +CASE(2) + int N = 3; + int M = 8; + int _ = 5; +END +CASE(3) + int N = 100; + int M = 100; + int _ = 310; +END +CASE(4) + int N = 77777; + int M = 77777; + int _ = -1; +END +/* +CASE(5) + int N = ; + int M = ; + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/567-U/1B.cpp Index: SRM/567-U/1B.cpp ================================================================== --- SRM/567-U/1B.cpp +++ SRM/567-U/1B.cpp @@ -0,0 +1,132 @@ +#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 StringGame { public: + vector getWinningStrings(vector S) + { + vector< vector > cb; + for(int i=0; i result; + for(int i=0; i as_cb(const string& s) + { + vector cb(26); + for(int i=0; i >& cb, int I) + { + vector enemy; + for(int i=0; i win, draw; + 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 vector & Expected, const vector & 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(_, StringGame().getWinningStrings(S));} +int main(){ + +CASE(0) + string S_[] = {"a", "b", "c", "d"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int __[] = {0, 1, 2, 3 }; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(1) + string S_[] = {"aabbcc", "aaabbb", "aaaccc"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int __[] = {1, 2 }; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(2) + string S_[] = {"ab", "ba"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + vector _; +END +CASE(3) + string S_[] = {"xaocxsss", "oooxsoas", "xaooosss", "xaocssss", "coxaosxx"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int __[] = {1, 3, 4 }; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(4) +string S_[] = {"aaabbc", "aabbcc", "aaaabc"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int __[] = {0, 1, 2}; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +/* +CASE(5) + string S_[] = ; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int __[] = ; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +*/ +} +// END CUT HERE ADDED SRM/567-U/1C.cpp Index: SRM/567-U/1C.cpp ================================================================== --- SRM/567-U/1C.cpp +++ SRM/567-U/1C.cpp @@ -0,0 +1,176 @@ +#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; + +static const unsigned MODVAL = 1000000009; + +class Mountains { public: + int countPlacements(vector heights, vector visibility) + { + int W = visibility[0].size(); + int N = visibility.size(); + memo.resize(N); + + vector view(W, 0); + return rec(W, view, heights.size()-1, heights, visibility); + } + + vector< map,int> > memo; + int rec(int W, const vector& view, int i, vector& H, const vector& V) + { + if(i < 0) + return 1; + + if(memo[i].count(view)) + return memo[i][view]; + + int mustL=0, mustR=W-1; + int mustNotL=W, mustNotR=-1; + for(int x=0; x view[x] ) { +// mustNotL = min(mustNotL, LLL); +// mustNotR = max(mustNotR, RRR); +// } + } + } + + LL result = 0; + for(int c=mustL; c<=mustR; ++c) if(c view2(W); + for(int x=0; x +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(_, Mountains().countPlacements(heights, visibility));} +int main(){ + +CASE(0) + int heights_[] = {2, 3, 2}; + vector heights(heights_, heights_+sizeof(heights_)/sizeof(*heights_)); + string visibility_[] = {"------", + "XXXX--", + "---XXX"}; + vector visibility(visibility_, visibility_+sizeof(visibility_)/sizeof(*visibility_)); + int _ = 4; +END +CASE(1) + int heights_[] = {4, 3, 4}; + vector heights(heights_, heights_+sizeof(heights_)/sizeof(*heights_)); + string visibility_[] = {"XXXXX--------", + "----------XXX", + "----XXXXXXX--"}; + vector visibility(visibility_, visibility_+sizeof(visibility_)/sizeof(*visibility_)); + int _ = 4; +END +CASE(2) + int heights_[] = {13, 2, 3, 2}; + vector heights(heights_, heights_+sizeof(heights_)/sizeof(*heights_)); + string visibility_[] = {"XXXXXXXXX", + "-XXX-----", + "----XXXXX", + "-----XXX-"}; + vector visibility(visibility_, visibility_+sizeof(visibility_)/sizeof(*visibility_)); + int _ = 9; +END +CASE(3) + int heights_[] = {8, 2, 9, 3, 10}; + vector heights(heights_, heights_+sizeof(heights_)/sizeof(*heights_)); + string visibility_[] = {"X------", + "-------", + "------X", + "-------", + "XXXXXXX"}; + vector visibility(visibility_, visibility_+sizeof(visibility_)/sizeof(*visibility_)); + int _ = 98; +END +CASE(4) + int heights_[] = {20, 20, 20, 20, 20, 20, 45, 50, 49, 50}; + vector heights(heights_, heights_+sizeof(heights_)/sizeof(*heights_)); + string visibility_[] = {"-------------------", + "-------------------", + "-------------------", + "-------------------", + "-------------------", + "-------------------", + "-------------------", + "------------XXXXXXX", + "XXXXXXX------------", + "XXXXXXXXXXXXXXXXXXX"} +; + vector visibility(visibility_, visibility_+sizeof(visibility_)/sizeof(*visibility_)); + int _ = 973726691; +END +CASE(5) + int heights_[] = {20, 20, 20, 20, 20, 20, 45, 50, 49, 50}; + vector heights(heights_, heights_+sizeof(heights_)/sizeof(*heights_)); + string visibility_[] = {"-------------------------------------------------", + "-------------------------------------------------", + "-------------------------------------------------", + "-------------------------------------------------", + "-------------------------------------------------", + "-------------------------------------------------", + "-------------------------------------------------", + "------------XXXXXXX------------------------------", + "XXXXXXX------------------------------------------", + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"} +; + vector visibility(visibility_, visibility_+sizeof(visibility_)/sizeof(*visibility_)); + int _ = -1; +END +} +// END CUT HERE