054a0e8c06 2014-09-26 kinaba: #include <iostream> 054a0e8c06 2014-09-26 kinaba: #include <sstream> 054a0e8c06 2014-09-26 kinaba: #include <iomanip> 054a0e8c06 2014-09-26 kinaba: #include <vector> 054a0e8c06 2014-09-26 kinaba: #include <string> 054a0e8c06 2014-09-26 kinaba: #include <map> 054a0e8c06 2014-09-26 kinaba: #include <set> 054a0e8c06 2014-09-26 kinaba: #include <algorithm> 054a0e8c06 2014-09-26 kinaba: #include <numeric> 054a0e8c06 2014-09-26 kinaba: #include <iterator> 054a0e8c06 2014-09-26 kinaba: #include <functional> 054a0e8c06 2014-09-26 kinaba: #include <complex> 054a0e8c06 2014-09-26 kinaba: #include <queue> 054a0e8c06 2014-09-26 kinaba: #include <stack> 054a0e8c06 2014-09-26 kinaba: #include <cmath> 054a0e8c06 2014-09-26 kinaba: #include <cassert> 054a0e8c06 2014-09-26 kinaba: #include <tuple> 054a0e8c06 2014-09-26 kinaba: using namespace std; 054a0e8c06 2014-09-26 kinaba: typedef long long LL; 054a0e8c06 2014-09-26 kinaba: typedef complex<double> CMP; 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: class DoubleTree { public: 054a0e8c06 2014-09-26 kinaba: int maximalScore(vector <int> a, vector <int> b, vector <int> c, vector <int> d, vector <int> score) 054a0e8c06 2014-09-26 kinaba: { 054a0e8c06 2014-09-26 kinaba: const int N = a.size() + 1; 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: vector<vector<LL>> dep(N, vector<LL>(N)); 054a0e8c06 2014-09-26 kinaba: add_dep(a, b, dep); 054a0e8c06 2014-09-26 kinaba: add_dep(c, d, dep); 054a0e8c06 2014-09-26 kinaba: closure(N, dep); 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: int best = 0; 054a0e8c06 2014-09-26 kinaba: for(int root=0; root<N; ++root) 054a0e8c06 2014-09-26 kinaba: { 054a0e8c06 2014-09-26 kinaba: int base_score = score[root]; 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: set<LL> cs; 054a0e8c06 2014-09-26 kinaba: for(int v=0; v<N; ++v) if(v!=root) 054a0e8c06 2014-09-26 kinaba: cs.insert(dep[min(root,v)][max(root,v)] &~ (1LL<<root)); 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: LL theSet = 0; 054a0e8c06 2014-09-26 kinaba: for(LL c: cs) { 054a0e8c06 2014-09-26 kinaba: int ss = 0; 054a0e8c06 2014-09-26 kinaba: for(int i=0; (1LL<<i)<=c; ++i) 054a0e8c06 2014-09-26 kinaba: if((1LL<<i)&c) 054a0e8c06 2014-09-26 kinaba: ss += score[i]; 054a0e8c06 2014-09-26 kinaba: if(ss>0) 054a0e8c06 2014-09-26 kinaba: theSet |= c; 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: int ss = 0; 054a0e8c06 2014-09-26 kinaba: for(int i=0; (1LL<<i)<=theSet; ++i) 054a0e8c06 2014-09-26 kinaba: if((1LL<<i)&theSet) 054a0e8c06 2014-09-26 kinaba: ss += score[i]; 054a0e8c06 2014-09-26 kinaba: best = max(best, base_score+ss); 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: return best; 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: void closure(int N, vector<vector<LL>>& dep) 054a0e8c06 2014-09-26 kinaba: { 054a0e8c06 2014-09-26 kinaba: for(bool upd=true; upd; ) { 054a0e8c06 2014-09-26 kinaba: upd = false; 054a0e8c06 2014-09-26 kinaba: for(int a=0; a<N; ++a) 054a0e8c06 2014-09-26 kinaba: for(int b=a; b<N; ++b) 054a0e8c06 2014-09-26 kinaba: for(int c=0; c<N; ++c) if((1LL<<c)&dep[a][b]) { 054a0e8c06 2014-09-26 kinaba: LL neo = dep[a][b] | dep[min(a,c)][max(a,c)] | dep[min(b,c)][max(b,c)]; 054a0e8c06 2014-09-26 kinaba: if(neo != dep[a][b]) { 054a0e8c06 2014-09-26 kinaba: upd = true; 054a0e8c06 2014-09-26 kinaba: dep[a][b] = neo; 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: void add_dep(const vector<int>& a, const vector<int>& b, vector<vector<LL>>& dep) 054a0e8c06 2014-09-26 kinaba: { 054a0e8c06 2014-09-26 kinaba: int N = a.size() + 1; 054a0e8c06 2014-09-26 kinaba: vector<vector<int>> G(N); 054a0e8c06 2014-09-26 kinaba: for(int i=0; i<N-1; ++i) { 054a0e8c06 2014-09-26 kinaba: G[a[i]].push_back(b[i]); 054a0e8c06 2014-09-26 kinaba: G[b[i]].push_back(a[i]); 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: for(int root=0; root<N; ++root) { 054a0e8c06 2014-09-26 kinaba: vector<int> stk; 054a0e8c06 2014-09-26 kinaba: function<void(int,int)> rec; 054a0e8c06 2014-09-26 kinaba: rec = [&](int pre, int v) { 054a0e8c06 2014-09-26 kinaba: stk.push_back(v); 054a0e8c06 2014-09-26 kinaba: for(int mid: stk) 054a0e8c06 2014-09-26 kinaba: dep[min(root,v)][max(root,v)] |= 1LL<<mid; 054a0e8c06 2014-09-26 kinaba: for(int u: G[v]) if(u!=pre) 054a0e8c06 2014-09-26 kinaba: rec(v, u); 054a0e8c06 2014-09-26 kinaba: stk.pop_back(); 054a0e8c06 2014-09-26 kinaba: }; 054a0e8c06 2014-09-26 kinaba: rec(-1, root); 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: }; 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: // BEGIN CUT HERE 054a0e8c06 2014-09-26 kinaba: #include <ctime> 054a0e8c06 2014-09-26 kinaba: double start_time; string timer() 054a0e8c06 2014-09-26 kinaba: { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 054a0e8c06 2014-09-26 kinaba: template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 054a0e8c06 2014-09-26 kinaba: { os << "{ "; 054a0e8c06 2014-09-26 kinaba: for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 054a0e8c06 2014-09-26 kinaba: os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 054a0e8c06 2014-09-26 kinaba: void verify_case(const int& Expected, const int& Received) { 054a0e8c06 2014-09-26 kinaba: bool ok = (Expected == Received); 054a0e8c06 2014-09-26 kinaba: if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 054a0e8c06 2014-09-26 kinaba: cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 054a0e8c06 2014-09-26 kinaba: #define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 054a0e8c06 2014-09-26 kinaba: #define END verify_case(_, DoubleTree().maximalScore(a, b, c, d, score));} 054a0e8c06 2014-09-26 kinaba: int main(){ 054a0e8c06 2014-09-26 kinaba: 054a0e8c06 2014-09-26 kinaba: CASE(0) 054a0e8c06 2014-09-26 kinaba: int a_[] = {0,0,1}; 054a0e8c06 2014-09-26 kinaba: vector <int> a(a_, a_+sizeof(a_)/sizeof(*a_)); 054a0e8c06 2014-09-26 kinaba: int b_[] = {1,3,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> b(b_, b_+sizeof(b_)/sizeof(*b_)); 054a0e8c06 2014-09-26 kinaba: int c_[] = {0,0,3}; 054a0e8c06 2014-09-26 kinaba: vector <int> c(c_, c_+sizeof(c_)/sizeof(*c_)); 054a0e8c06 2014-09-26 kinaba: int d_[] = {1,3,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> d(d_, d_+sizeof(d_)/sizeof(*d_)); 054a0e8c06 2014-09-26 kinaba: int score_[] = {1000,24,100,-200}; 054a0e8c06 2014-09-26 kinaba: vector <int> score(score_, score_+sizeof(score_)/sizeof(*score_)); 054a0e8c06 2014-09-26 kinaba: int _ = 1024; 054a0e8c06 2014-09-26 kinaba: END 054a0e8c06 2014-09-26 kinaba: CASE(1) 054a0e8c06 2014-09-26 kinaba: int a_[] = {0,0,1}; 054a0e8c06 2014-09-26 kinaba: vector <int> a(a_, a_+sizeof(a_)/sizeof(*a_)); 054a0e8c06 2014-09-26 kinaba: int b_[] = {1,3,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> b(b_, b_+sizeof(b_)/sizeof(*b_)); 054a0e8c06 2014-09-26 kinaba: int c_[] = {0,0,3}; 054a0e8c06 2014-09-26 kinaba: vector <int> c(c_, c_+sizeof(c_)/sizeof(*c_)); 054a0e8c06 2014-09-26 kinaba: int d_[] = {1,3,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> d(d_, d_+sizeof(d_)/sizeof(*d_)); 054a0e8c06 2014-09-26 kinaba: int score_[] = {1000,24,100,200}; 054a0e8c06 2014-09-26 kinaba: vector <int> score(score_, score_+sizeof(score_)/sizeof(*score_)); 054a0e8c06 2014-09-26 kinaba: int _ = 1324; 054a0e8c06 2014-09-26 kinaba: END 054a0e8c06 2014-09-26 kinaba: CASE(2) 054a0e8c06 2014-09-26 kinaba: int a_[] = {0,0,1}; 054a0e8c06 2014-09-26 kinaba: vector <int> a(a_, a_+sizeof(a_)/sizeof(*a_)); 054a0e8c06 2014-09-26 kinaba: int b_[] = {1,3,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> b(b_, b_+sizeof(b_)/sizeof(*b_)); 054a0e8c06 2014-09-26 kinaba: int c_[] = {0,0,3}; 054a0e8c06 2014-09-26 kinaba: vector <int> c(c_, c_+sizeof(c_)/sizeof(*c_)); 054a0e8c06 2014-09-26 kinaba: int d_[] = {1,3,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> d(d_, d_+sizeof(d_)/sizeof(*d_)); 054a0e8c06 2014-09-26 kinaba: int score_[] = {-1000,-24,-100,-200}; 054a0e8c06 2014-09-26 kinaba: vector <int> score(score_, score_+sizeof(score_)/sizeof(*score_)); 054a0e8c06 2014-09-26 kinaba: int _ = 0; 054a0e8c06 2014-09-26 kinaba: END 054a0e8c06 2014-09-26 kinaba: CASE(3) 054a0e8c06 2014-09-26 kinaba: int a_[] = {0,0,1}; 054a0e8c06 2014-09-26 kinaba: vector <int> a(a_, a_+sizeof(a_)/sizeof(*a_)); 054a0e8c06 2014-09-26 kinaba: int b_[] = {1,3,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> b(b_, b_+sizeof(b_)/sizeof(*b_)); 054a0e8c06 2014-09-26 kinaba: int c_[] = {0,0,3}; 054a0e8c06 2014-09-26 kinaba: vector <int> c(c_, c_+sizeof(c_)/sizeof(*c_)); 054a0e8c06 2014-09-26 kinaba: int d_[] = {1,3,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> d(d_, d_+sizeof(d_)/sizeof(*d_)); 054a0e8c06 2014-09-26 kinaba: int score_[] = {-1000,24,100,200}; 054a0e8c06 2014-09-26 kinaba: vector <int> score(score_, score_+sizeof(score_)/sizeof(*score_)); 054a0e8c06 2014-09-26 kinaba: int _ = 200; 054a0e8c06 2014-09-26 kinaba: END 054a0e8c06 2014-09-26 kinaba: CASE(4) 054a0e8c06 2014-09-26 kinaba: int a_[] = {0,0,1,1,2,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> a(a_, a_+sizeof(a_)/sizeof(*a_)); 054a0e8c06 2014-09-26 kinaba: int b_[] = {1,2,3,4,5,6}; 054a0e8c06 2014-09-26 kinaba: vector <int> b(b_, b_+sizeof(b_)/sizeof(*b_)); 054a0e8c06 2014-09-26 kinaba: int c_[] = {0,0,1,1,2,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> c(c_, c_+sizeof(c_)/sizeof(*c_)); 054a0e8c06 2014-09-26 kinaba: int d_[] = {1,2,3,4,5,6}; 054a0e8c06 2014-09-26 kinaba: vector <int> d(d_, d_+sizeof(d_)/sizeof(*d_)); 054a0e8c06 2014-09-26 kinaba: int score_[] = {-3,2,2,-1,2,2,-1}; 054a0e8c06 2014-09-26 kinaba: vector <int> score(score_, score_+sizeof(score_)/sizeof(*score_)); 054a0e8c06 2014-09-26 kinaba: int _ = 5; 054a0e8c06 2014-09-26 kinaba: END 054a0e8c06 2014-09-26 kinaba: CASE(5) 054a0e8c06 2014-09-26 kinaba: int a_[] = {0,0,1,1,2,2}; 054a0e8c06 2014-09-26 kinaba: vector <int> a(a_, a_+sizeof(a_)/sizeof(*a_)); 054a0e8c06 2014-09-26 kinaba: int b_[] = {1,2,3,4,5,6}; 054a0e8c06 2014-09-26 kinaba: vector <int> b(b_, b_+sizeof(b_)/sizeof(*b_)); 054a0e8c06 2014-09-26 kinaba: int c_[] = {0,0,0,0,0,0}; 054a0e8c06 2014-09-26 kinaba: vector <int> c(c_, c_+sizeof(c_)/sizeof(*c_)); 054a0e8c06 2014-09-26 kinaba: int d_[] = {1,2,3,4,5,6}; 054a0e8c06 2014-09-26 kinaba: vector <int> d(d_, d_+sizeof(d_)/sizeof(*d_)); 054a0e8c06 2014-09-26 kinaba: int score_[] = {-3,2,2,-1,2,2,-1}; 054a0e8c06 2014-09-26 kinaba: vector <int> score(score_, score_+sizeof(score_)/sizeof(*score_)); 054a0e8c06 2014-09-26 kinaba: int _ = 5; 054a0e8c06 2014-09-26 kinaba: END 054a0e8c06 2014-09-26 kinaba: /* 054a0e8c06 2014-09-26 kinaba: CASE(6) 054a0e8c06 2014-09-26 kinaba: int a_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> a(a_, a_+sizeof(a_)/sizeof(*a_)); 054a0e8c06 2014-09-26 kinaba: int b_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> b(b_, b_+sizeof(b_)/sizeof(*b_)); 054a0e8c06 2014-09-26 kinaba: int c_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> c(c_, c_+sizeof(c_)/sizeof(*c_)); 054a0e8c06 2014-09-26 kinaba: int d_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> d(d_, d_+sizeof(d_)/sizeof(*d_)); 054a0e8c06 2014-09-26 kinaba: int score_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> score(score_, score_+sizeof(score_)/sizeof(*score_)); 054a0e8c06 2014-09-26 kinaba: int _ = ; 054a0e8c06 2014-09-26 kinaba: END 054a0e8c06 2014-09-26 kinaba: CASE(7) 054a0e8c06 2014-09-26 kinaba: int a_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> a(a_, a_+sizeof(a_)/sizeof(*a_)); 054a0e8c06 2014-09-26 kinaba: int b_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> b(b_, b_+sizeof(b_)/sizeof(*b_)); 054a0e8c06 2014-09-26 kinaba: int c_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> c(c_, c_+sizeof(c_)/sizeof(*c_)); 054a0e8c06 2014-09-26 kinaba: int d_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> d(d_, d_+sizeof(d_)/sizeof(*d_)); 054a0e8c06 2014-09-26 kinaba: int score_[] = ; 054a0e8c06 2014-09-26 kinaba: vector <int> score(score_, score_+sizeof(score_)/sizeof(*score_)); 054a0e8c06 2014-09-26 kinaba: int _ = ; 054a0e8c06 2014-09-26 kinaba: END 054a0e8c06 2014-09-26 kinaba: */ 054a0e8c06 2014-09-26 kinaba: } 054a0e8c06 2014-09-26 kinaba: // END CUT HERE