ADDED SRM/679/1A.cpp Index: SRM/679/1A.cpp ================================================================== --- SRM/679/1A.cpp +++ SRM/679/1A.cpp @@ -0,0 +1,125 @@ +#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 FiringEmployees { public: + int fire(vector manager, vector salary, vector productivity) + { + const int N = manager.size()+1; + + vector> children(N); + for(int i=1; i best(N); + for(int i=N-1; i>=0; --i) { + int total = (i ? productivity[i-1] - salary[i-1] : 0); + for(int u: children[i]) + total += best[u]; + if(total > 0) + best[i] = total; + } + return best[0]; + } +}; + +// 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(_, FiringEmployees().fire(manager, salary, productivity));} +int main(){ + +CASE(0) + int manager_[] = {0,0,0}; + vector manager(manager_, manager_+sizeof(manager_)/sizeof(*manager_)); + int salary_[] = {1,2,3}; + vector salary(salary_, salary_+sizeof(salary_)/sizeof(*salary_)); + int productivity_[] = {3,2,1}; + vector productivity(productivity_, productivity_+sizeof(productivity_)/sizeof(*productivity_)); + int _ = 2; +END +CASE(1) + int manager_[] = {0,1,2,3}; + vector manager(manager_, manager_+sizeof(manager_)/sizeof(*manager_)); + int salary_[] = {4,3,2,1}; + vector salary(salary_, salary_+sizeof(salary_)/sizeof(*salary_)); + int productivity_[] = {2,3,4,5}; + vector productivity(productivity_, productivity_+sizeof(productivity_)/sizeof(*productivity_)); + int _ = 4; +END +CASE(2) + int manager_[] = {0,1}; + vector manager(manager_, manager_+sizeof(manager_)/sizeof(*manager_)); + int salary_[] = {1,10}; + vector salary(salary_, salary_+sizeof(salary_)/sizeof(*salary_)); + int productivity_[] = {5,5}; + vector productivity(productivity_, productivity_+sizeof(productivity_)/sizeof(*productivity_)); + int _ = 4; +END +CASE(3) + int manager_[] = {0,1,2,1,2,3,4,2,3}; + vector manager(manager_, manager_+sizeof(manager_)/sizeof(*manager_)); + int salary_[] = {5,3,6,8,4,2,4,6,7}; + vector salary(salary_, salary_+sizeof(salary_)/sizeof(*salary_)); + int productivity_[] = {2,5,7,8,5,3,5,7,9}; + vector productivity(productivity_, productivity_+sizeof(productivity_)/sizeof(*productivity_)); + int _ = 6; +END +CASE(4) + int manager_[] = {0,0,1,1,2,2}; + vector manager(manager_, manager_+sizeof(manager_)/sizeof(*manager_)); + int salary_[] = {1,1,1,2,2,2}; + vector salary(salary_, salary_+sizeof(salary_)/sizeof(*salary_)); + int productivity_[] = {2,2,2,1,1,1}; + vector productivity(productivity_, productivity_+sizeof(productivity_)/sizeof(*productivity_)); + int _ = 3; +END +/* +CASE(5) + int manager_[] = ; + vector manager(manager_, manager_+sizeof(manager_)/sizeof(*manager_)); + int salary_[] = ; + vector salary(salary_, salary_+sizeof(salary_)/sizeof(*salary_)); + int productivity_[] = ; + vector productivity(productivity_, productivity_+sizeof(productivity_)/sizeof(*productivity_)); + int _ = ; +END +CASE(6) + int manager_[] = ; + vector manager(manager_, manager_+sizeof(manager_)/sizeof(*manager_)); + int salary_[] = ; + vector salary(salary_, salary_+sizeof(salary_)/sizeof(*salary_)); + int productivity_[] = ; + vector productivity(productivity_, productivity_+sizeof(productivity_)/sizeof(*productivity_)); + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/679/1B.cpp Index: SRM/679/1B.cpp ================================================================== --- SRM/679/1B.cpp +++ SRM/679/1B.cpp @@ -0,0 +1,201 @@ +#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; + +double outer_prod(const CMP& a, const CMP& b) { return imag(conj(a)*b); } + +bool point_in_polygon( vector& ps, CMP p ) +{ + bool in = false; + for(int i=0; i b.imag()) swap(a,b); + if(a.imag()<=0 && 0 blueX, vector blueY, vector redX, vector redY) + { + const int B = blueX.size(); + const int R = redX.size(); + + int best = 0; + for(int b_use=0; b_use> G(B); + for(int b1=0; b1 poly; + poly.emplace_back(blueX[b_use], blueY[b_use]); + poly.emplace_back(blueX[b1], blueY[b1]); + poly.emplace_back(blueX[b2], blueY[b2]); + for(int r=0; r>& G) + { + const int N = G.size(); + vector badmask(G.size()); + for(int v=0; v rec = [&](int v, LL rest, int cur) { + if(best < cur) + best = cur; + if(rest == 0) + return; + if(cur + __builtin_popcountll(rest) <= best) + return; + + LL r1 = rest &~ (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(_, RedAndBluePoints().find(blueX, blueY, redX, redY));} +int main(){ + +CASE(0) + int blueX_[] = {0,0,10,10}; + vector blueX(blueX_, blueX_+sizeof(blueX_)/sizeof(*blueX_)); + int blueY_[] = {0,10,0,10}; + vector blueY(blueY_, blueY_+sizeof(blueY_)/sizeof(*blueY_)); + int redX_[] = {100}; + vector redX(redX_, redX_+sizeof(redX_)/sizeof(*redX_)); + int redY_[] = {120}; + vector redY(redY_, redY_+sizeof(redY_)/sizeof(*redY_)); + int _ = 4; +END +CASE(1) + int blueX_[] = {0,0,10,10}; + vector blueX(blueX_, blueX_+sizeof(blueX_)/sizeof(*blueX_)); + int blueY_[] = {0,10,0,10}; + vector blueY(blueY_, blueY_+sizeof(blueY_)/sizeof(*blueY_)); + int redX_[] = {3}; + vector redX(redX_, redX_+sizeof(redX_)/sizeof(*redX_)); + int redY_[] = {4}; + vector redY(redY_, redY_+sizeof(redY_)/sizeof(*redY_)); + int _ = 3; +END +CASE(2) + int blueX_[] = {0,0,10,10}; + vector blueX(blueX_, blueX_+sizeof(blueX_)/sizeof(*blueX_)); + int blueY_[] = {0,10,0,10}; + vector blueY(blueY_, blueY_+sizeof(blueY_)/sizeof(*blueY_)); + int redX_[] = {3,6}; + vector redX(redX_, redX_+sizeof(redX_)/sizeof(*redX_)); + int redY_[] = {2,7}; + vector redY(redY_, redY_+sizeof(redY_)/sizeof(*redY_)); + int _ = 2; +END +CASE(3) + int blueX_[] = {0}; + vector blueX(blueX_, blueX_+sizeof(blueX_)/sizeof(*blueX_)); + int blueY_[] = {0}; + vector blueY(blueY_, blueY_+sizeof(blueY_)/sizeof(*blueY_)); + int redX_[] = {1}; + vector redX(redX_, redX_+sizeof(redX_)/sizeof(*redX_)); + int redY_[] = {1}; + vector redY(redY_, redY_+sizeof(redY_)/sizeof(*redY_)); + int _ = 1; +END +CASE(4) + int blueX_[] = {5, 6, 6}; + vector blueX(blueX_, blueX_+sizeof(blueX_)/sizeof(*blueX_)); + int blueY_[] = {9, 0, 5}; + vector blueY(blueY_, blueY_+sizeof(blueY_)/sizeof(*blueY_)); + int redX_[] = {7}; + vector redX(redX_, redX_+sizeof(redX_)/sizeof(*redX_)); + int redY_[] = {6}; + vector redY(redY_, redY_+sizeof(redY_)/sizeof(*redY_)); + int _ = 3; +END +/* +CASE(5) + int blueX_[] = ; + vector blueX(blueX_, blueX_+sizeof(blueX_)/sizeof(*blueX_)); + int blueY_[] = ; + vector blueY(blueY_, blueY_+sizeof(blueY_)/sizeof(*blueY_)); + int redX_[] = ; + vector redX(redX_, redX_+sizeof(redX_)/sizeof(*redX_)); + int redY_[] = ; + vector redY(redY_, redY_+sizeof(redY_)/sizeof(*redY_)); + int _ = ; +END +CASE(6) + int blueX_[] = ; + vector blueX(blueX_, blueX_+sizeof(blueX_)/sizeof(*blueX_)); + int blueY_[] = ; + vector blueY(blueY_, blueY_+sizeof(blueY_)/sizeof(*blueY_)); + int redX_[] = ; + vector redX(redX_, redX_+sizeof(redX_)/sizeof(*redX_)); + int redY_[] = ; + vector redY(redY_, redY_+sizeof(redY_)/sizeof(*redY_)); + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/679/1C.cpp Index: SRM/679/1C.cpp ================================================================== --- SRM/679/1C.cpp +++ SRM/679/1C.cpp @@ -0,0 +1,135 @@ +#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; + +static const int MODVAL = 1000000007; +class BagAndCards { public: + int getHash(int n, int m, int x, int a, int b, int c, string isGood) + { + vector> count(n, vector(m, 0)); + for(int i=0; i mult(m); + for(int c1=0; c1 +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(_, BagAndCards().getHash(n, m, x, a, b, c, isGood));} +int main(){ + +CASE(0) + int n = 2; + int m = 4; + int x = 1; + int a = 1; + int b = 0; + int c = 0; + string isGood = "NNYYNYN"; + int _ = 9; +END +CASE(1) + int n = 3; + int m = 5; + int x = 1; + int a = 1; + int b = 1; + int c = 2; + string isGood = "NNYYNYNYN"; + int _ = 1532; +END +CASE(2) + int n = 10; + int m = 20; + int x = 111; + int a = 222; + int b = 333; + int c = 444; + string isGood = "NNNNNYYYNNNYYYYYYNNYYYYNNNNYNNYYYNNNYYN" ; + int _ = 450750683; +END +CASE(3) + int n = 2; + int m = 2; + int x = 1; + int a = 1; + int b = 0; + int c = 0; + string isGood = "NNY"; + int _ = 1; +END +/* +CASE(4) + int n = ; + int m = ; + int x = ; + int a = ; + int b = ; + int c = ; + string isGood = ; + int _ = ; +END +CASE(5) + int n = ; + int m = ; + int x = ; + int a = ; + int b = ; + int c = ; + string isGood = ; + int _ = ; +END +*/ +} +// END CUT HERE ADDED lib/graph/maxIndependentSet.cpp Index: lib/graph/maxIndependentSet.cpp ================================================================== --- lib/graph/maxIndependentSet.cpp +++ lib/graph/maxIndependentSet.cpp @@ -0,0 +1,41 @@ +//------------------------------------------------------------- +// Bruteforuce O(2^V) search with trivial edagari. +// +// |V| must be <= 63 +// +// Verified by +// - SRM 679 Div1 Lv2 +//------------------------------------------------------------- + +int max_independent_set(const vector>& G) +{ + const int N = G.size(); + vector badmask(G.size()); + for(int v=0; v rec = [&](int v, LL rest, int cur) { + if(best < cur) + best = cur; + if(rest == 0) + return; + if(cur + __builtin_popcountll(rest) <= best) + return; + + LL r1 = rest &~ (1LL<