ADDED SRM/633-U/1A.cpp Index: SRM/633-U/1A.cpp ================================================================== --- SRM/633-U/1A.cpp +++ SRM/633-U/1A.cpp @@ -0,0 +1,120 @@ +#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 PeriodicJumping { public: + int minimalTime(int x, vector jumpLengths) + { + if(x==0) + return 0; + if(x<0) + x=-x; + + vector js; + js.insert(js.end(), jumpLengths.begin(), jumpLengths.end()); + js.insert(js.end(), jumpLengths.begin(), jumpLengths.end()); + const LL all_sum = accumulate(js.begin(), js.end(), 0LL); + + LL best = 1LL<<62; + for(int i=0; i(best, i+1); + // [0, sum+K*all_sum] in the Kth round. + LL K = max(1LL, (x-sum+all_sum-1)/all_sum); + best = min(best, K*js.size()+i+1); + } + return int(best); + } +}; + +// 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(_, PeriodicJumping().minimalTime(x, jumpLengths));} +int main(){ + +CASE(0) + int x = 15; + int jumpLengths_[] = {1,2,3,4,5,6,7,8,9,10}; + vector jumpLengths(jumpLengths_, jumpLengths_+sizeof(jumpLengths_)/sizeof(*jumpLengths_)); + int _ = 5; +END +CASE(1) + int x = 5; + int jumpLengths_[] = {5}; + vector jumpLengths(jumpLengths_, jumpLengths_+sizeof(jumpLengths_)/sizeof(*jumpLengths_)); + int _ = 1; +END +CASE(2) + int x = 1; + int jumpLengths_[] = {10}; + vector jumpLengths(jumpLengths_, jumpLengths_+sizeof(jumpLengths_)/sizeof(*jumpLengths_)); + int _ = 2; +END +CASE(3) + int x = -10; + int jumpLengths_[] = {2,3,4,500,6,7,8}; + vector jumpLengths(jumpLengths_, jumpLengths_+sizeof(jumpLengths_)/sizeof(*jumpLengths_)); + int _ = 11; +END +CASE(4) + int x = -1000000000; + int jumpLengths_[] = {1}; + vector jumpLengths(jumpLengths_, jumpLengths_+sizeof(jumpLengths_)/sizeof(*jumpLengths_)); + int _ = 1000000000; +END +CASE(5) + int x = 0; + int jumpLengths_[] = {19911120}; + vector jumpLengths(jumpLengths_, jumpLengths_+sizeof(jumpLengths_)/sizeof(*jumpLengths_)); + int _ = 0; +END +/* +CASE(6) + int x = ; + int jumpLengths_[] = ; + vector jumpLengths(jumpLengths_, jumpLengths_+sizeof(jumpLengths_)/sizeof(*jumpLengths_)); + int _ = ; +END +CASE(7) + int x = ; + int jumpLengths_[] = ; + vector jumpLengths(jumpLengths_, jumpLengths_+sizeof(jumpLengths_)/sizeof(*jumpLengths_)); + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/633-U/1B-U.cpp Index: SRM/633-U/1B-U.cpp ================================================================== --- SRM/633-U/1B-U.cpp +++ SRM/633-U/1B-U.cpp @@ -0,0 +1,224 @@ +#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 DoubleTree { public: + int maximalScore(vector a, vector b, vector c, vector d, vector score) + { + const int N = a.size() + 1; + + vector> dep(N, vector(N)); + add_dep(a, b, dep); + add_dep(c, d, dep); + closure(N, dep); + + int best = 0; + for(int root=0; root cs; + for(int v=0; v0) + theSet |= c; + } + + int ss = 0; + for(int i=0; (1LL<>& dep) + { + for(bool upd=true; upd; ) { + upd = false; + for(int a=0; a& a, const vector& b, vector>& dep) + { + int N = a.size() + 1; + vector> G(N); + for(int i=0; i stk; + function rec; + rec = [&](int pre, int v) { + stk.push_back(v); + for(int mid: stk) + dep[min(root,v)][max(root,v)] |= 1LL< +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(_, DoubleTree().maximalScore(a, b, c, d, score));} +int main(){ + +CASE(0) + int a_[] = {0,0,1}; + vector a(a_, a_+sizeof(a_)/sizeof(*a_)); + int b_[] = {1,3,2}; + vector b(b_, b_+sizeof(b_)/sizeof(*b_)); + int c_[] = {0,0,3}; + vector c(c_, c_+sizeof(c_)/sizeof(*c_)); + int d_[] = {1,3,2}; + vector d(d_, d_+sizeof(d_)/sizeof(*d_)); + int score_[] = {1000,24,100,-200}; + vector score(score_, score_+sizeof(score_)/sizeof(*score_)); + int _ = 1024; +END +CASE(1) + int a_[] = {0,0,1}; + vector a(a_, a_+sizeof(a_)/sizeof(*a_)); + int b_[] = {1,3,2}; + vector b(b_, b_+sizeof(b_)/sizeof(*b_)); + int c_[] = {0,0,3}; + vector c(c_, c_+sizeof(c_)/sizeof(*c_)); + int d_[] = {1,3,2}; + vector d(d_, d_+sizeof(d_)/sizeof(*d_)); + int score_[] = {1000,24,100,200}; + vector score(score_, score_+sizeof(score_)/sizeof(*score_)); + int _ = 1324; +END +CASE(2) + int a_[] = {0,0,1}; + vector a(a_, a_+sizeof(a_)/sizeof(*a_)); + int b_[] = {1,3,2}; + vector b(b_, b_+sizeof(b_)/sizeof(*b_)); + int c_[] = {0,0,3}; + vector c(c_, c_+sizeof(c_)/sizeof(*c_)); + int d_[] = {1,3,2}; + vector d(d_, d_+sizeof(d_)/sizeof(*d_)); + int score_[] = {-1000,-24,-100,-200}; + vector score(score_, score_+sizeof(score_)/sizeof(*score_)); + int _ = 0; +END +CASE(3) + int a_[] = {0,0,1}; + vector a(a_, a_+sizeof(a_)/sizeof(*a_)); + int b_[] = {1,3,2}; + vector b(b_, b_+sizeof(b_)/sizeof(*b_)); + int c_[] = {0,0,3}; + vector c(c_, c_+sizeof(c_)/sizeof(*c_)); + int d_[] = {1,3,2}; + vector d(d_, d_+sizeof(d_)/sizeof(*d_)); + int score_[] = {-1000,24,100,200}; + vector score(score_, score_+sizeof(score_)/sizeof(*score_)); + int _ = 200; +END +CASE(4) + int a_[] = {0,0,1,1,2,2}; + vector a(a_, a_+sizeof(a_)/sizeof(*a_)); + int b_[] = {1,2,3,4,5,6}; + vector b(b_, b_+sizeof(b_)/sizeof(*b_)); + int c_[] = {0,0,1,1,2,2}; + vector c(c_, c_+sizeof(c_)/sizeof(*c_)); + int d_[] = {1,2,3,4,5,6}; + vector d(d_, d_+sizeof(d_)/sizeof(*d_)); + int score_[] = {-3,2,2,-1,2,2,-1}; + vector score(score_, score_+sizeof(score_)/sizeof(*score_)); + int _ = 5; +END +CASE(5) + int a_[] = {0,0,1,1,2,2}; + vector a(a_, a_+sizeof(a_)/sizeof(*a_)); + int b_[] = {1,2,3,4,5,6}; + vector b(b_, b_+sizeof(b_)/sizeof(*b_)); + int c_[] = {0,0,0,0,0,0}; + vector c(c_, c_+sizeof(c_)/sizeof(*c_)); + int d_[] = {1,2,3,4,5,6}; + vector d(d_, d_+sizeof(d_)/sizeof(*d_)); + int score_[] = {-3,2,2,-1,2,2,-1}; + vector score(score_, score_+sizeof(score_)/sizeof(*score_)); + int _ = 5; +END +/* +CASE(6) + int a_[] = ; + vector a(a_, a_+sizeof(a_)/sizeof(*a_)); + int b_[] = ; + vector b(b_, b_+sizeof(b_)/sizeof(*b_)); + int c_[] = ; + vector c(c_, c_+sizeof(c_)/sizeof(*c_)); + int d_[] = ; + vector d(d_, d_+sizeof(d_)/sizeof(*d_)); + int score_[] = ; + vector score(score_, score_+sizeof(score_)/sizeof(*score_)); + int _ = ; +END +CASE(7) + int a_[] = ; + vector a(a_, a_+sizeof(a_)/sizeof(*a_)); + int b_[] = ; + vector b(b_, b_+sizeof(b_)/sizeof(*b_)); + int c_[] = ; + vector c(c_, c_+sizeof(c_)/sizeof(*c_)); + int d_[] = ; + vector d(d_, d_+sizeof(d_)/sizeof(*d_)); + int score_[] = ; + vector score(score_, score_+sizeof(score_)/sizeof(*score_)); + int _ = ; +END +*/ +} +// END CUT HERE