Check-in [e3362a9488]
Not logged in
Overview
SHA1 Hash:e3362a9488bd08cbe6085633b4f0cceca8f1a3a2
Date: 2014-05-10 14:58:59
User: kinaba
Comment:619
Timelines: family | ancestors | descendants | both | trunk
Downloads: Tarball | ZIP archive
Other Links: files | file ages | manifest
Tags And Properties
Changes

Added SRM/619-U/1A.cpp version [c3cddc4fcc7fde59]

1 +#include <iostream> 2 +#include <sstream> 3 +#include <iomanip> 4 +#include <vector> 5 +#include <string> 6 +#include <map> 7 +#include <set> 8 +#include <algorithm> 9 +#include <numeric> 10 +#include <iterator> 11 +#include <functional> 12 +#include <complex> 13 +#include <queue> 14 +#include <stack> 15 +#include <cmath> 16 +#include <cassert> 17 +#include <tuple> 18 +using namespace std; 19 +typedef long long LL; 20 +typedef complex<double> CMP; 21 + 22 +class Family { public: 23 + string isFamily(vector <int> parent1, vector <int> parent2) 24 + { 25 + return solve(parent1, parent2) ? "Possible" : "Impossible"; 26 + } 27 + 28 + bool solve(vector <int> parent1, vector <int> parent2) 29 + { 30 + const int N = parent1.size(); 31 + 32 + map<int, vector<int>> diff; 33 + for(int i=0; i<N; ++i) 34 + { 35 + int a = parent1[i]; 36 + int b = parent2[i]; 37 + if(a != -1) { 38 + assert(b != -1); 39 + diff[a].push_back(b); 40 + diff[b].push_back(a); 41 + } 42 + } 43 + 44 + bool ok = true; 45 + 46 + enum {Unk, Ma=1, Fe=2}; 47 + vector<int> gender(N, Unk); 48 + function<void(int)> rec_fill; rec_fill = [&](int p) { 49 + for(int q : diff[p]) 50 + if(gender[q] == Unk) { 51 + gender[q] = 3 - gender[p]; 52 + rec_fill(q); 53 + } else if(gender[q] == gender[p]) { 54 + ok = false; 55 + return; 56 + } 57 + }; 58 + 59 + for(int p=0; p<N; ++p) 60 + { 61 + if(gender[p] == Unk) { 62 + gender[p] = Ma; 63 + rec_fill(p); 64 + if(!ok) 65 + return ok; 66 + } 67 + } 68 + return ok; 69 + } 70 +}; 71 + 72 +// BEGIN CUT HERE 73 +#include <ctime> 74 +double start_time; string timer() 75 + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 76 +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 77 + { os << "{ "; 78 + for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 79 + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 80 +void verify_case(const string& Expected, const string& Received) { 81 + bool ok = (Expected == Received); 82 + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 83 + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 84 +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 85 +#define END verify_case(_, Family().isFamily(parent1, parent2));} 86 +int main(){ 87 + 88 +CASE(0) 89 + int parent1_[] = {-1,-1,0}; 90 + vector <int> parent1(parent1_, parent1_+sizeof(parent1_)/sizeof(*parent1_)); 91 + int parent2_[] = {-1,-1,1}; 92 + vector <int> parent2(parent2_, parent2_+sizeof(parent2_)/sizeof(*parent2_)); 93 + string _ = "Possible"; 94 +END 95 +CASE(1) 96 + int parent1_[] = {-1,-1,-1,-1,-1}; 97 + vector <int> parent1(parent1_, parent1_+sizeof(parent1_)/sizeof(*parent1_)); 98 + int parent2_[] = {-1,-1,-1,-1,-1}; 99 + vector <int> parent2(parent2_, parent2_+sizeof(parent2_)/sizeof(*parent2_)); 100 + string _ = "Possible"; 101 +END 102 +CASE(2) 103 + int parent1_[] = {-1,-1,0,0,1}; 104 + vector <int> parent1(parent1_, parent1_+sizeof(parent1_)/sizeof(*parent1_)); 105 + int parent2_[] = {-1,-1,1,2,2}; 106 + vector <int> parent2(parent2_, parent2_+sizeof(parent2_)/sizeof(*parent2_)); 107 + string _ = "Impossible"; 108 +END 109 +CASE(3) 110 + int parent1_[] = {-1,-1,-1,-1,1,-1,0,5,6,-1,0,3,8,6} 111 +; 112 + vector <int> parent1(parent1_, parent1_+sizeof(parent1_)/sizeof(*parent1_)); 113 + int parent2_[] = {-1,-1,-1,-1,3,-1,4,6,5,-1,5,4,6,1} 114 +; 115 + vector <int> parent2(parent2_, parent2_+sizeof(parent2_)/sizeof(*parent2_)); 116 + string _ = "Possible"; 117 +END 118 +CASE(4) 119 + int parent1_[] = {-1,-1,-1,2,2,-1,5,6,4,6,2,1,8,0,2,4,6,9,-1,16,-1,11}; 120 + vector <int> parent1(parent1_, parent1_+sizeof(parent1_)/sizeof(*parent1_)); 121 + int parent2_[] = {-1,-1,-1,1,0,-1,1,4,2,0,4,8,2,3,0,5,14,14,-1,7,-1,13}; 122 + vector <int> parent2(parent2_, parent2_+sizeof(parent2_)/sizeof(*parent2_)); 123 + string _ = "Impossible"; 124 +END 125 +/* 126 +CASE(5) 127 + int parent1_[] = ; 128 + vector <int> parent1(parent1_, parent1_+sizeof(parent1_)/sizeof(*parent1_)); 129 + int parent2_[] = ; 130 + vector <int> parent2(parent2_, parent2_+sizeof(parent2_)/sizeof(*parent2_)); 131 + string _ = ; 132 +END 133 +CASE(6) 134 + int parent1_[] = ; 135 + vector <int> parent1(parent1_, parent1_+sizeof(parent1_)/sizeof(*parent1_)); 136 + int parent2_[] = ; 137 + vector <int> parent2(parent2_, parent2_+sizeof(parent2_)/sizeof(*parent2_)); 138 + string _ = ; 139 +END 140 +*/ 141 +} 142 +// END CUT HERE

Added SRM/619-U/1B-U.cpp version [68f91e93f6818277]

1 +#include <iostream> 2 +#include <sstream> 3 +#include <iomanip> 4 +#include <vector> 5 +#include <string> 6 +#include <map> 7 +#include <set> 8 +#include <algorithm> 9 +#include <numeric> 10 +#include <iterator> 11 +#include <functional> 12 +#include <complex> 13 +#include <queue> 14 +#include <stack> 15 +#include <cmath> 16 +#include <cassert> 17 +#include <tuple> 18 +using namespace std; 19 +typedef long long LL; 20 +typedef complex<double> CMP; 21 + 22 +class MovingRooksDiv1 { public: 23 + vector <int> move(vector <int> Y1, vector <int> Y2) 24 + { 25 + const int N = Y1.size(); 26 + vector<int> ans; 27 + 28 + for(int i=0; i<N; ++i) 29 + { 30 + if(Y1[i] < Y2[i]) 31 + return vector<int>(1, -1); 32 + else if(Y1[i] > Y2[i]) 33 + { 34 + vector<int> idx; 35 + idx.push_back(i); 36 + for(int k=i+1;; ++k) 37 + { 38 + if(Y1[idx.back()] > Y1[k]) 39 + idx.push_back(k); 40 + if(Y1[k] == Y2[i]) 41 + break; 42 + } 43 + for(int k=idx.size()-2; k>=0; --k) { 44 + ans.push_back(idx[k]); 45 + ans.push_back(idx[k+1]); 46 + swap(Y1[idx[k]], Y1[idx[k+1]]); 47 + } 48 + } 49 + } 50 + if(ans.size() > 2500) 51 + ans.resize(2500); 52 + return ans; 53 + } 54 +}; 55 + 56 +// BEGIN CUT HERE 57 +#include <ctime> 58 +double start_time; string timer() 59 + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 60 +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 61 + { os << "{ "; 62 + for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 63 + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 64 +void verify_case(const vector <int>& Expected, const vector <int>& Received) { 65 + bool ok = (Expected == Received); 66 + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 67 + cerr << "\to: " << Expected << endl << "\tx: " << Received << endl; } } 68 +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 69 +#define END verify_case(_, MovingRooksDiv1().move(Y1, Y2));} 70 +int main(){ 71 + 72 +CASE(0) 73 + int Y1_[] = {0}; 74 + vector <int> Y1(Y1_, Y1_+sizeof(Y1_)/sizeof(*Y1_)); 75 + int Y2_[] = {0}; 76 + vector <int> Y2(Y2_, Y2_+sizeof(Y2_)/sizeof(*Y2_)); 77 + vector <int> _; 78 +END 79 +CASE(1) 80 + int Y1_[] = {1,0}; 81 + vector <int> Y1(Y1_, Y1_+sizeof(Y1_)/sizeof(*Y1_)); 82 + int Y2_[] = {0,1}; 83 + vector <int> Y2(Y2_, Y2_+sizeof(Y2_)/sizeof(*Y2_)); 84 + int __[] = {0, 1 }; 85 + vector <int> _(__, __+sizeof(__)/sizeof(*__)); 86 +END 87 +CASE(2) 88 + int Y1_[] = {1,2,0}; 89 + vector <int> Y1(Y1_, Y1_+sizeof(Y1_)/sizeof(*Y1_)); 90 + int Y2_[] = {2,0,1}; 91 + vector <int> Y2(Y2_, Y2_+sizeof(Y2_)/sizeof(*Y2_)); 92 + int __[] = {-1 }; 93 + vector <int> _(__, __+sizeof(__)/sizeof(*__)); 94 +END 95 +CASE(3) 96 + int Y1_[] = {2,1,0,3,5,4}; 97 + vector <int> Y1(Y1_, Y1_+sizeof(Y1_)/sizeof(*Y1_)); 98 + int Y2_[] = {0,1,2,3,4,5}; 99 + vector <int> Y2(Y2_, Y2_+sizeof(Y2_)/sizeof(*Y2_)); 100 + int __[] = {0, 1, 0, 2, 1, 2, 4, 5 }; 101 + vector <int> _(__, __+sizeof(__)/sizeof(*__)); 102 +END 103 +CASE(4) 104 + int Y1_[] = {10,9,8,7,6,5,4,3,2,1,0}; 105 + vector <int> Y1(Y1_, Y1_+sizeof(Y1_)/sizeof(*Y1_)); 106 + int Y2_[] = {0,1,2,3,4,5,6,7,8,9,10}; 107 + vector <int> Y2(Y2_, Y2_+sizeof(Y2_)/sizeof(*Y2_)); 108 + int __[] = {0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 2, 3, 2, 4, 2, 5, 2, 6, 2, 7, 2, 8, 2, 9, 2, 10, 3, 4, 3, 5, 3, 6, 3, 7, 3, 8, 3, 9, 3, 10, 4, 5, 4, 6, 4, 7, 4, 8, 4, 9, 4, 10, 5, 6, 5, 7, 5, 8, 5, 9, 5, 10, 6, 7, 6, 8, 6, 9, 6, 10, 7, 8, 7, 9, 7, 10, 8, 9, 8, 10, 9, 10 }; 109 + vector <int> _(__, __+sizeof(__)/sizeof(*__)); 110 +END 111 +CASE(5) 112 +int Y1_[] = {2,1,0}; 113 + vector <int> Y1(Y1_, Y1_+sizeof(Y1_)/sizeof(*Y1_)); 114 + int Y2_[] = {0,2,1}; 115 + vector <int> Y2(Y2_, Y2_+sizeof(Y2_)/sizeof(*Y2_)); 116 + int __[] = {123456789}; 117 + vector <int> _(__, __+sizeof(__)/sizeof(*__)); 118 +END 119 +/* 120 +CASE(6) 121 + int Y1_[] = ; 122 + vector <int> Y1(Y1_, Y1_+sizeof(Y1_)/sizeof(*Y1_)); 123 + int Y2_[] = ; 124 + vector <int> Y2(Y2_, Y2_+sizeof(Y2_)/sizeof(*Y2_)); 125 + int __[] = ; 126 + vector <int> _(__, __+sizeof(__)/sizeof(*__)); 127 +END 128 +*/ 129 +} 130 +// END CUT HERE

Added SRM/619-U/1C.cpp version [8609bba59add5d74]

1 +#include <iostream> 2 +#include <sstream> 3 +#include <iomanip> 4 +#include <vector> 5 +#include <string> 6 +#include <map> 7 +#include <set> 8 +#include <algorithm> 9 +#include <numeric> 10 +#include <iterator> 11 +#include <functional> 12 +#include <complex> 13 +#include <queue> 14 +#include <stack> 15 +#include <cmath> 16 +#include <cassert> 17 +#include <tuple> 18 +using namespace std; 19 +typedef long long LL; 20 +typedef complex<double> CMP; 21 + 22 +static const unsigned MODVAL = 1000000007; 23 +struct mint 24 +{ 25 + unsigned val; 26 + mint():val(0){} 27 + mint(int x):val(x%MODVAL) {} 28 + mint(unsigned x):val(x%MODVAL) {} 29 + mint(LL x):val(x%MODVAL) {} 30 +}; 31 +mint& operator+=(mint& x, mint y) { return x = x.val+y.val; } 32 +mint& operator-=(mint& x, mint y) { return x = x.val-y.val+MODVAL; } 33 +mint& operator*=(mint& x, mint y) { return x = LL(x.val)*y.val; } 34 +mint operator+(mint x, mint y) { return x+=y; } 35 +mint operator-(mint x, mint y) { return x-=y; } 36 +mint operator*(mint x, mint y) { return x*=y; } 37 + 38 +mint POW(mint x, LL e) { mint v=1; for(;e;x*=x,e>>=1) if(e&1) v*=x; return v; } 39 +mint& operator/=(mint& x, mint y) { return x *= POW(y, MODVAL-2); } 40 +mint operator/(mint x, mint y) { return x/=y; } 41 + 42 +vector<mint> FAC_(1,1); 43 +mint FAC(LL n) { while( FAC_.size()<=n ) FAC_.push_back( FAC_.back()*(LL)FAC_.size() ); return FAC_[n]; } 44 + 45 +class LongWordsDiv1 { public: 46 + int count(int n) 47 + { 48 + vector<mint> dp(n+1); 49 + dp[0] = 0; 50 + dp[1] = 1; 51 + for(int x=2; x<=n; ++x) 52 + { 53 + mint total = dp[x-1]; 54 + for(int k=1; k<=x-1; ++k) 55 + total += dp[k] * dp[x-1-k]; 56 + dp[x] = total; 57 + } 58 + return (dp[n] * FAC(n)).val; 59 + } 60 +}; 61 + 62 +// BEGIN CUT HERE 63 +#include <ctime> 64 +double start_time; string timer() 65 + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 66 +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 67 + { os << "{ "; 68 + for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 69 + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 70 +void verify_case(const int& Expected, const int& Received) { 71 + bool ok = (Expected == Received); 72 + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 73 + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 74 +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 75 +#define END verify_case(_, LongWordsDiv1().count(n));} 76 +int main(){ 77 + 78 +CASE(0) 79 + int n = 1; 80 + int _ = 1; 81 +END 82 +CASE(1) 83 + int n = 2; 84 + int _ = 2; 85 +END 86 +CASE(2) 87 + int n = 5; 88 + int _ = 1080; 89 +END 90 +CASE(3) 91 + int n = 100; 92 + int _ = 486425238; 93 +END 94 +/* 95 +CASE(4) 96 + int n = ; 97 + int _ = ; 98 +END 99 +CASE(5) 100 + int n = ; 101 + int _ = ; 102 +END 103 +*/ 104 +} 105 +// END CUT HERE