ADDED SRM/560-U/1A.cpp Index: SRM/560-U/1A.cpp ================================================================== --- SRM/560-U/1A.cpp +++ SRM/560-U/1A.cpp @@ -0,0 +1,109 @@ +#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 TomekPhone { public: + int minKeystrokes(vector fr, vector keySizes) + { + vector cand; + 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(_, TomekPhone().minKeystrokes(frequencies, keySizes));} +int main(){ + +CASE(0) + int frequencies_[] = {7,3,4,1}; + vector frequencies(frequencies_, frequencies_+sizeof(frequencies_)/sizeof(*frequencies_)); + int keySizes_[] = {2,2}; + vector keySizes(keySizes_, keySizes_+sizeof(keySizes_)/sizeof(*keySizes_)); + int _ = 19; +END +CASE(1) + int frequencies_[] = {13,7,4,20}; + vector frequencies(frequencies_, frequencies_+sizeof(frequencies_)/sizeof(*frequencies_)); + int keySizes_[] = {2,1}; + vector keySizes(keySizes_, keySizes_+sizeof(keySizes_)/sizeof(*keySizes_)); + int _ = -1; +END +CASE(2) + int frequencies_[] = {11,23,4,50,1000,7,18}; + vector frequencies(frequencies_, frequencies_+sizeof(frequencies_)/sizeof(*frequencies_)); + int keySizes_[] = {3,1,4}; + vector keySizes(keySizes_, keySizes_+sizeof(keySizes_)/sizeof(*keySizes_)); + int _ = 1164; +END +CASE(3) + int frequencies_[] = {100,1000,1,10}; + vector frequencies(frequencies_, frequencies_+sizeof(frequencies_)/sizeof(*frequencies_)); + int keySizes_[] = {50}; + vector keySizes(keySizes_, keySizes_+sizeof(keySizes_)/sizeof(*keySizes_)); + int _ = 1234; +END +CASE(4) + int frequencies_[] = {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}; + vector frequencies(frequencies_, frequencies_+sizeof(frequencies_)/sizeof(*frequencies_)); + int keySizes_[] = {10,10,10,10,10,10,10,10}; + vector keySizes(keySizes_, keySizes_+sizeof(keySizes_)/sizeof(*keySizes_)); + int _ = 3353; +END +/* +CASE(5) + int frequencies_[] = ; + vector frequencies(frequencies_, frequencies_+sizeof(frequencies_)/sizeof(*frequencies_)); + int keySizes_[] = ; + vector keySizes(keySizes_, keySizes_+sizeof(keySizes_)/sizeof(*keySizes_)); + int _ = ; +END +CASE(6) + int frequencies_[] = ; + vector frequencies(frequencies_, frequencies_+sizeof(frequencies_)/sizeof(*frequencies_)); + int keySizes_[] = ; + vector keySizes(keySizes_, keySizes_+sizeof(keySizes_)/sizeof(*keySizes_)); + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/560-U/1B.cpp Index: SRM/560-U/1B.cpp ================================================================== --- SRM/560-U/1B.cpp +++ SRM/560-U/1B.cpp @@ -0,0 +1,144 @@ +#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 DrawingPointsDivOne { public: + int maxSteps(vector x, vector y) + { + static const int INF = 300; + int L=0, R=INF+1; + while(R-L>1) { + int C = (L+R)/2; + (possible(x,y,C) ? L : R) = C; + } + return L==INF ? -1 : L; + } + + bool possible(const vector& x, const vector& y, int C) + { + int N = x.size(); + int Z = C+10+280+C+10; + int MID = C+10+140; + vector m(Z*Z); + + // paint + for(int i=0; i=0; --y) + for(int x=Z-3; x>=0; --x) + m[y*Z+x] += m[(y+2)*Z+x]+m[y*Z+(x+2)]-m[(y+2)*Z+(x+2)]; + + for(int y=0; y=0; --y) + for(int x=Z-3; x>=0; --x) + m[y*Z+x] += m[(y+2)*Z+x]+m[y*Z+(x+2)]-m[(y+2)*Z+(x+2)]; + + // count + int cnt = 0; + int S = (MID&1); + for(int yy=S; yy=0 && xx-C>=0) { + int s = + +m[ (yy+C+2)*Z+(xx+C+2) ] + -m[ (yy-C )*Z+(xx+C+2) ] + -m[ (yy+C+2)*Z+(xx-C ) ] + +m[ (yy-C )*Z+(xx-C ) ]; + if(s==(C+1)*(C+1)) + ++cnt; + } + return cnt == N; + } +}; + +// 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 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(_, DrawingPointsDivOne().maxSteps(x, y));} +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 _ = 1; +END +CASE(1) + int x_[] = {0,2}; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = {0,0}; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int _ = 0; +END +CASE(2) + int x_[] = {-70}; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = {3}; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int _ = -1; +END +CASE(3) + int x_[] = {-41,-40,1,-11,-32,-7,24,-11,49,-15,-22,20,-8,54,54,69,16,-30,36,-6,-30,40,64,20,-66, + -37,-33,-18,-35,36,9,61,-43,45,5,60,-8,-58,65,-66,41,12,34,-11,-57,-38,46,63,-55,3}; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = {5,-24,-2,-4,23,14,1,70,-26,45,15,48,32,-41,54,-47,-67,-46,-9,-53,54,28,-61,11,53,68, + -33,62,37,-8,-17,-17,48,19,-49,56,-41,16,17,-50,28,59,10,50,23,-16,56,31,-70,-44}; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int _ = 9; +END +/* +CASE(4) + int x_[] = ; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = ; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int _ = ; +END +CASE(5) + int x_[] = ; + vector x(x_, x_+sizeof(x_)/sizeof(*x_)); + int y_[] = ; + vector y(y_, y_+sizeof(y_)/sizeof(*y_)); + int _ = ; +END +*/ +} +// END CUT HERE