ADDED SRM/505-u/1Au.cpp Index: SRM/505-u/1Au.cpp ================================================================== --- SRM/505-u/1Au.cpp +++ SRM/505-u/1Au.cpp @@ -0,0 +1,170 @@ +#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 RectangleArea { public: + int minimumQueries(vector known) + { + const int H = known.size(); + const int W = known[0].size(); + for(int y=0; y +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(_, RectangleArea().minimumQueries(known));} +int main(){ + +CASE(0) + string known_[] = {"NN", + "NN"}; + vector known(known_, known_+sizeof(known_)/sizeof(*known_)); + int _ = 3; +END +CASE(1) + string known_[] = {"YNY", + "NYN", + "YNY"}; + vector known(known_, known_+sizeof(known_)/sizeof(*known_)); + int _ = 1; +END +CASE(2) + string known_[] = {"YY", + "YY", + "YY", + "YY"}; + vector known(known_, known_+sizeof(known_)/sizeof(*known_)); + int _ = 0; +END +CASE(3) + string known_[] = {"NNNNNNNNNN"}; + vector known(known_, known_+sizeof(known_)/sizeof(*known_)); + int _ = 10; +END +CASE(4) + string known_[] = {"NNYYYNN", + "NNNNNYN", + "YYNNNNY", + "NNNYNNN", + "YYNNNNY"}; + vector known(known_, known_+sizeof(known_)/sizeof(*known_)); + int _ = 2; +END +CASE(5) + string known_[] = { + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", + }; + vector known(known_, known_+sizeof(known_)/sizeof(*known_)); + int _ = -1; +END +CASE(6) + string known_[] = {"N"}; + vector known(known_, known_+sizeof(known_)/sizeof(*known_)); + int _ = 1; +END + +} +// END CUT HERE ADDED SRM/505-u/1B.cpp Index: SRM/505-u/1B.cpp ================================================================== --- SRM/505-u/1B.cpp +++ SRM/505-u/1B.cpp @@ -0,0 +1,156 @@ +#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 SetMultiples { public: + long long smallestSubset(long long A, long long B, long long C, long long D) + { + vector< pair > noneed( 1, make_pair(1,100000) ); + + LL cnt = 0; + for(LL p=1; p<=100000; ++p) + { + if( A<=p&&p<=B || C<=p&&p<=D ) + if( need(p, A, B, C, D) ) + ++cnt; + if( p > 1 ) { + add(noneed, p, A, B); + add(noneed, p, C, D); + } + } + sort(noneed.begin(), noneed.end(), &my_order); + LL a = count_need(noneed, A, B); + LL b = count_need(noneed, C, D); + return cnt + a + b; + } + + static bool need(LL p, LL A, LL B, LL C, LL D) + { + return !covered(p,A,B) && !covered(p,C,D); + } + + static bool covered(LL p, LL A, LL B) + { + LL lo = A%p==0 ? A/p : A/p+1; + LL hi = B/p; + return ( lo<=hi && 2<=hi ); + } + + static void add(vector< pair >& noneed, LL p, LL A, LL B) + { + LL lo = A%p==0 ? A/p : A/p+1; + LL hi = B/p; + if( lo <= hi ) + noneed.push_back( make_pair(lo,hi) ); + } + + static bool my_order( const pair& lhs, const pair& rhs ) + { + if( lhs.second != rhs.second ) + return lhs.second > rhs.second; + return lhs.first < rhs.first; + } + + static LL count_need(const vector< pair >& noneed, LL A, LL B) + { + LL cnt = 0; + LL highest_need = B; + 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(_, SetMultiples().smallestSubset(A, B, C, D));} +int main(){ + +CASE(0) + long long A = 1LL; + long long B = 1LL; + long long C = 2LL; + long long D = 2LL; + long long _ = 1LL; +END +CASE(1) + long long A = 1LL; + long long B = 2LL; + long long C = 3LL; + long long D = 4LL; + long long _ = 2LL; +END +CASE(2) + long long A = 2LL; + long long B = 3LL; + long long C = 5LL; + long long D = 7LL; + long long _ = 3LL; +END +CASE(3) + long long A = 1LL; + long long B = 10LL; + long long C = 100LL; + long long D = 1000LL; + long long _ = 500LL; +END +CASE(4) + long long A = 1000000000LL; + long long B = 2000000000LL; + long long C = 9000000000LL; + long long D = 10000000000LL; + long long _ = 1254365078LL; +END +CASE(5) + long long A = 1LL; + long long B = 1000000000LL; + long long C = 2000000000LL; + long long D = 10000000000LL; + long long _ = -1LL; +END +CASE(6) + long long A = 1LL; + long long B = 2LL; + long long C = 3LL; + long long D = 5LL; + long long _ = 3LL; +END + +} +// END CUT HERE