ADDED SRM/526-U/1A.cpp Index: SRM/526-U/1A.cpp ================================================================== --- SRM/526-U/1A.cpp +++ SRM/526-U/1A.cpp @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __GNUC__ +#include +#define unordered_map __gnu_cxx::hash_map +#else +#include +#endif +using namespace std; +typedef long long LL; +typedef complex CMP; + +class DucksAlignment { public: + int minimumTime(vector grid) + { + vector xs, ys; + for(int y=0; y& xs) + { + int mid = xs[xs.size()/2]; + int sum = 0; + for(int i=0; i& xs) + { + int best = xs.back() * xs.size(); + for(int lb=0; lb<=xs.back(); ++lb) { + int sum = 0; + 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(_, DucksAlignment().minimumTime(grid));} +int main(){ + +CASE(0) + string grid_[] = {".o", + "o."}; + vector grid(grid_, grid_+sizeof(grid_)/sizeof(*grid_)); + int _ = 1; +END +CASE(1) + string grid_[] = {".o...", + "..o..", + "....o"}; + vector grid(grid_, grid_+sizeof(grid_)/sizeof(*grid_)); + int _ = 3; +END +CASE(2) + string grid_[] = {"o..........", + "..o........", + ".......o...", + "...........", + "...........", + "...........", + "........o..", + "..........."}; + vector grid(grid_, grid_+sizeof(grid_)/sizeof(*grid_)); + int _ = 16; +END +CASE(3) + string grid_[] = {".........", + "....o....", + "........."}; + vector grid(grid_, grid_+sizeof(grid_)/sizeof(*grid_)); + int _ = 0; +END +CASE(4) + string grid_[] = {"...o..........................", + "............................o.", + ".o............................", + "............o.................", + ".................o............", + "......................o.......", + "......o.......................", + "....o.........................", + "...............o..............", + ".......................o......", + "...........................o..", + ".......o......................"}; + vector grid(grid_, grid_+sizeof(grid_)/sizeof(*grid_)); + int _ = 99; +END +/* +CASE(5) + string grid_[] = ; + vector grid(grid_, grid_+sizeof(grid_)/sizeof(*grid_)); + int _ = ; +END +CASE(6) + string grid_[] = ; + vector grid(grid_, grid_+sizeof(grid_)/sizeof(*grid_)); + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/526-U/1B.cpp Index: SRM/526-U/1B.cpp ================================================================== --- SRM/526-U/1B.cpp +++ SRM/526-U/1B.cpp @@ -0,0 +1,120 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __GNUC__ +#include +#define unordered_map __gnu_cxx::hash_map +#else +#include +#endif +using namespace std; +typedef long long LL; +typedef complex CMP; +static const int INF = 0x3fffffff; + +class PrimeCompositeGame { public: + int theOutcome(int N, int K) + { + enum {P, C}; + + // sieve + vector< vector > is(2, vector(N+1, true)); + is[P][0] = is[C][0] = is[P][1] = is[C][1] = false; + for(int p=2; p<=N; ++p) { + if( is[P][p] ) + for(int q=p+p; q<=N; q+=p) + is[P][q] = false; + is[C][p] = !is[P][p]; + } + + vector< vector > score(2, vector(N+1)); + multiset lastK[2]; + for(int t=0; t<=N; ++t) { + for(int me=0; me<2; ++me) + if( lastK[1^me].empty() ) // no valid move. immediately lose. + score[me][t] = 0; + else if( *lastK[1^me].begin() > 0 ) // all move make opponent win. take the longest. + score[me][t] = - (1 + *lastK[1^me].rbegin()); + else // I can win. take the shortest. + score[me][t] = (1 + abs(*--lastK[1^me].lower_bound(1))); + // maintain last K scores. + for(int me=0; me<2; ++me) { + if( is[1^me][t] ) + lastK[me].insert( score[me][t] ); + if( t-K>=0 && is[1^me][t-K] ) + lastK[me].erase(lastK[me].find(score[me][t-K])); + } + } + return score[P][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(_, PrimeCompositeGame().theOutcome(N, K));} +int main(){ + +CASE(0) + int N = 3; + int K = 2; + int _ = 1; +END +CASE(1) + int N = 58; + int K = 1; + int _ = 0; +END +CASE(2) + int N = 30; + int K = 3; + int _ = -2; +END +CASE(3) + int N = 6; + int K = 3; + int _ = 1; +END +CASE(4) + int N = 526; + int K = 58; + int _ = 19; +END +CASE(5) + int N = 474747; + int K = 474747; + int _ = 1; +END +/* +CASE(6) + int N = ; + int K = ; + int _ = ; +END +*/ +} +// END CUT HERE Index: lib/graph/mincostFlow.cpp ================================================================== --- lib/graph/mincostFlow.cpp +++ lib/graph/mincostFlow.cpp @@ -3,10 +3,11 @@ // O(??) // // Verified by // - SRM 487 Div2 LV3 // - SRM 491 Div1 LV3 +// - SRM 526 Div1 LV1 //------------------------------------------------------------- #include #include #include @@ -50,12 +51,12 @@ } pair calc( Vert s_, Vert t_ ) { const int N=idgen.size(), S=idgen.v2id(s_), T=idgen.v2id(t_); - static const Cost COST_INF = 1e+300; // !!EDIT HERE!! - static const Flow FLOW_INF = 0x7fffffff; + static const Cost COST_INF = // 0x7fffffff; // !!EDIT HERE!! + static const Flow FLOW_INF = // 0x7fffffff; Cost total_cost = 0; Flow total_flow = 0; vector h(N, 0); // potential for(Flow RF=FLOW_INF; RF>0; ) // residual flow