ADDED SRM/674-U/1A.cpp Index: SRM/674-U/1A.cpp ================================================================== --- SRM/674-U/1A.cpp +++ SRM/674-U/1A.cpp @@ -0,0 +1,88 @@ +#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 VampireTree { public: + int maxDistance(vector num) + { + int d1 = 0, d_else = 0, d_kill = 0; + for(int d: num) + if(d == 1) + d1++; + else + d_else++, d_kill+=d-2; + if(d1-d_kill == 2) + return d_else + 1; + else + return -1; + } +}; + +// 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(_, VampireTree().maxDistance(num));} +int main(){ + +CASE(0) + int num_[] = {1, 2, 1}; + vector num(num_, num_+sizeof(num_)/sizeof(*num_)); + int _ = 2; +END +CASE(1) + int num_[] = {2, 2, 2}; + vector num(num_, num_+sizeof(num_)/sizeof(*num_)); + int _ = -1; +END +CASE(2) + int num_[] = {1, 1, 1, 1, 4}; + vector num(num_, num_+sizeof(num_)/sizeof(*num_)); + int _ = 2; +END +CASE(3) + int num_[] = {1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; + vector num(num_, num_+sizeof(num_)/sizeof(*num_)); + int _ = -1; +END +/* +CASE(4) + int num_[] = ; + vector num(num_, num_+sizeof(num_)/sizeof(*num_)); + int _ = ; +END +CASE(5) + int num_[] = ; + vector num(num_, num_+sizeof(num_)/sizeof(*num_)); + int _ = ; +END +*/ + +} +// END CUT HERE ADDED SRM/674-U/1B.cpp Index: SRM/674-U/1B.cpp ================================================================== --- SRM/674-U/1B.cpp +++ SRM/674-U/1B.cpp @@ -0,0 +1,188 @@ +#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 FindingKids { public: + long long getSum(int n, int q, int A_, const int B, const int C) + { + set pos_set; + vector pos(n), dir(n); + + const int M = 1000000007; + LL A = A_; + for(int i=0; i kid(q), time(q); + for(int i=0; i& P, const vector& D, + const int Q, const vector& K, const vector& T) { + + vector kid_id_to_pos_order(N); { + vector kids_sorted_by_pos(N); + for(int i=0; i move_kids, stay_kids; + for(int i=0; i& stay_kids, const vector& move_kids, const LL t) { + if(stay_kids.empty()) return move_kids[k]+t; + if(move_kids.empty()) return stay_kids[k]; + if(stay_kids.back() < move_kids.front()+t) { + if(k < stay_kids.size()) + return stay_kids[k]; + else + return move_kids[k-stay_kids.size()]+t; + } + if(move_kids.back()+t < stay_kids.front()) { + if(k < move_kids.size()) + return move_kids[k]+t; + else + return stay_kids[k-move_kids.size()]+t; + } + + int L=0, R=stay_kids.size(); + while(R-L>1) { + int C = (L+R)/2; + int left_in_stay = C; + int left_in_move = lower_bound(move_kids.begin(), move_kids.end(), stay_kids[C]-t) - move_kids.begin(); + int left = left_in_stay + left_in_move; + if(left == k) + return stay_kids[C]; + (left >= k ? R : L) = C; + } + + L=0, R=move_kids.size(); + while(R-L>1) { + int C = (L+R)/2; + int left_in_move = C; + int left_in_stay = lower_bound(stay_kids.begin(), stay_kids.end(), move_kids[C]+t) - stay_kids.begin(); + int left = left_in_stay + left_in_move; + if(left == k) + return move_kids[C]+t; + (left >= k ? R : L) = C; + } + + vector now = stay_kids; + for(LL p: move_kids) now.push_back(p + t); + sort(now.begin(), now.end()); + return now[k]; + } +}; + +// 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 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(_, FindingKids().getSum(n, q, A, B, C));} +int main(){ + +CASE(0) + int n = 5; + int q = 2; + int A = 0; + int B = 1; + int C = 1; + long long _ = 15LL; +END +CASE(1) + int n = 5; + int q = 4; + int A = 3; + int B = 2; + int C = 1; + long long _ = 43376LL; +END +CASE(2) + int n = 200000; + int q = 200000; + int A = 12345; + int B = 67890; + int C = 111213141; + long long _ = 133378408428237LL; +END +/* +CASE(3) + int n = ; + int q = ; + int A = ; + int B = ; + int C = ; + long long _ = LL; +END +CASE(4) + int n = ; + int q = ; + int A = ; + int B = ; + int C = ; + long long _ = LL; +END +*/ +} +// END CUT HERE ADDED SRM/674-U/1C-U.cpp Index: SRM/674-U/1C-U.cpp ================================================================== --- SRM/674-U/1C-U.cpp +++ SRM/674-U/1C-U.cpp @@ -0,0 +1,172 @@ +#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 ClassicProblem { public: + long long maximalValue(vector cnt, vector w, vector v, int limit) + { + vector idx; + for(int i=0; iw[b]; + return LL(v[a])*w[b] < LL(v[b])*w[a]; + }); + + LL gain = 0; + while(limit > 6480) { + if(idx.empty()) + break; + int i = idx.back(), ww=w[i], vv=v[i]; + int n = min(cnt[i], (limit-6400)/ww); + limit -= LL(ww)*n; + gain += LL(vv)*n; + cnt[i] -= n; + idx.pop_back(); + } + + vector w2v = rec(0, cnt, w, v, limit); + return gain + *max_element(w2v.begin(), w2v.end()); + } + + vector rec(int i, const vector & C, const vector& W, const vector& V, int limit) + { + if(i == C.size()) + return vector(1, 0LL); + + vector w2v = rec(i+1, C, W, V, limit); + if(C[i] == 0) + return w2v; + + vector w2v_neo(limit+1, 0LL); + for(int w=0; w limit) + break; + w2v_neo[ww] = max(w2v_neo[ww], w2v[w] + LL(V[i])*k); + } + } + return w2v_neo; + } +}; + +// 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 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(_, ClassicProblem().maximalValue(cnt, w, v, limit));} +int main(){ + +CASE(0) + int cnt_[] = {100,100}; + vector cnt(cnt_, cnt_+sizeof(cnt_)/sizeof(*cnt_)); + int w_[] = {2,3}; + vector w(w_, w_+sizeof(w_)/sizeof(*w_)); + int v_[] = {3,5}; + vector v(v_, v_+sizeof(v_)/sizeof(*v_)); + int limit = 6; + long long _ = 10LL; +END +CASE(1) + int cnt_[] = {100,100}; + vector cnt(cnt_, cnt_+sizeof(cnt_)/sizeof(*cnt_)); + int w_[] = {2,3}; + vector w(w_, w_+sizeof(w_)/sizeof(*w_)); + int v_[] = {3,5}; + vector v(v_, v_+sizeof(v_)/sizeof(*v_)); + int limit = 5; + long long _ = 8LL; +END +CASE(2) + int cnt_[] = {100,102}; + vector cnt(cnt_, cnt_+sizeof(cnt_)/sizeof(*cnt_)); + int w_[] = {2,3}; + vector w(w_, w_+sizeof(w_)/sizeof(*w_)); + int v_[] = {3,5}; + vector v(v_, v_+sizeof(v_)/sizeof(*v_)); + int limit = 1000000000; + long long _ = 810LL; +END +CASE(3) + int cnt_[] = {100,100}; + vector cnt(cnt_, cnt_+sizeof(cnt_)/sizeof(*cnt_)); + int w_[] = {2,3}; + vector w(w_, w_+sizeof(w_)/sizeof(*w_)); + int v_[] = {3,5}; + vector v(v_, v_+sizeof(v_)/sizeof(*v_)); + int limit = 1; + long long _ = 0LL; +END +CASE(4) + int cnt_[] = {1,2,3,4,5,6,7,8}; + vector cnt(cnt_, cnt_+sizeof(cnt_)/sizeof(*cnt_)); + int w_[] = {4,2,6,7,5,8,3,1}; + vector w(w_, w_+sizeof(w_)/sizeof(*w_)); + int v_[] = {3,6,4,1,2,8,5,7}; + vector v(v_, v_+sizeof(v_)/sizeof(*v_)); + int limit = 15; + long long _ = 73LL; +END +CASE(5) + int cnt_[] = {1000000000}; + vector cnt(cnt_, cnt_+sizeof(cnt_)/sizeof(*cnt_)); + int w_[] = {1}; + vector w(w_, w_+sizeof(w_)/sizeof(*w_)); + int v_[] = {1000000000}; + vector v(v_, v_+sizeof(v_)/sizeof(*v_)); + int limit = 1000000000; + long long _ = 1000000000000000000LL; +END +/* +CASE(6) + int cnt_[] = ; + vector cnt(cnt_, cnt_+sizeof(cnt_)/sizeof(*cnt_)); + int w_[] = ; + vector w(w_, w_+sizeof(w_)/sizeof(*w_)); + int v_[] = ; + vector v(v_, v_+sizeof(v_)/sizeof(*v_)); + int limit = ; + long long _ = LL; +END +CASE(7) + int cnt_[] = ; + vector cnt(cnt_, cnt_+sizeof(cnt_)/sizeof(*cnt_)); + int w_[] = ; + vector w(w_, w_+sizeof(w_)/sizeof(*w_)); + int v_[] = ; + vector v(v_, v_+sizeof(v_)/sizeof(*v_)); + int limit = ; + long long _ = LL; +END +*/ +} +// END CUT HERE