Overview
SHA1 Hash: | 4cc63e9faa159cf38070af912853497d2c42497c |
---|---|
Date: | 2012-10-11 12:09:13 |
User: | kinaba |
Comment: | 557 |
Timelines: | family | ancestors | descendants | both | trunk |
Downloads: | Tarball | ZIP archive |
Other Links: | files | file ages | manifest |
Tags And Properties
- branch=trunk inherited from [9165bd3629]
- sym-trunk inherited from [9165bd3629]
Changes
Modified CheckList.pptx from [e9052e045d34dbe0] to [80509898d6857d5c].
cannot compute difference between binary files
Added SRM/557-U/1A.cpp version [51b78e2d0929a6eb]
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 +using namespace std; 18 +typedef long long LL; 19 +typedef long double LD; 20 +typedef complex<LD> CMP; 21 + 22 +class FoxAndMountainEasy { public: 23 + string possible(int n, int h0, int hn, string history) 24 + { 25 + int z = 0; 26 + int min_z = 0; 27 + for(int i=0; i<history.size(); ++i) { 28 + z += (history[i]=='U' ? +1 : -1); 29 + min_z = min(z, min_z); 30 + } 31 + 32 + for(int x=0; x+history.size()<=n; ++x) 33 + { 34 + int hx = h0 + x; 35 + if(hx+min_z < 0) 36 + continue; 37 + int hy = hx + z; 38 + if( possible(hn-hy, n-(x+history.size())) ) 39 + return "YES"; 40 + } 41 + return "NO"; 42 + } 43 + 44 + bool possible(int dh, int k) 45 + { 46 + if((k+dh)%2 != 0) 47 + return false; 48 + int u = (k+dh)/2; 49 + int d = k - u; 50 + return 0<=u && u<=k && u+d==k && u-d==dh; 51 + } 52 +}; 53 + 54 +// BEGIN CUT HERE 55 +#include <ctime> 56 +double start_time; string timer() 57 + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 58 +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 59 + { os << "{ "; 60 + for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 61 + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 62 +void verify_case(const string& Expected, const string& Received) { 63 + bool ok = (Expected == Received); 64 + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 65 + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 66 +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 67 +#define END verify_case(_, FoxAndMountainEasy().possible(n, h0, hn, history));} 68 +int main(){ 69 + 70 +CASE(0) 71 + int n = 4; 72 + int h0 = 0; 73 + int hn = 4; 74 + string history = "UU"; 75 + string _ = "YES"; 76 +END 77 +CASE(1) 78 + int n = 4; 79 + int h0 = 0; 80 + int hn = 4; 81 + string history = "D"; 82 + string _ = "NO"; 83 +END 84 +CASE(2) 85 + int n = 4; 86 + int h0 = 100000; 87 + int hn = 100000; 88 + string history = "DDU"; 89 + string _ = "YES"; 90 +END 91 +CASE(3) 92 + int n = 4; 93 + int h0 = 0; 94 + int hn = 0; 95 + string history = "DDU"; 96 + string _ = "NO"; 97 +END 98 +CASE(4) 99 + int n = 20; 100 + int h0 = 20; 101 + int hn = 20; 102 + string history = "UDUDUDUDUD"; 103 + string _ = "YES"; 104 +END 105 +CASE(5) 106 + int n = 20; 107 + int h0 = 0; 108 + int hn = 0; 109 + string history = "UUUUUUUUUU"; 110 + string _ = "YES"; 111 +END 112 +CASE(6) 113 + int n = 20; 114 + int h0 = 0; 115 + int hn = 0; 116 + string history = "UUUUUUUUUUU"; 117 + string _ = "NO"; 118 +END 119 +CASE(7) 120 + int n = 4; 121 + int h0 = 3; 122 + int hn = 1; 123 + string history = "U"; 124 + string _ = "YES"; 125 +END 126 +CASE(8) 127 + int n = 1; 128 + int h0 = 0; 129 + int hn = 1; 130 + string history = "U"; 131 + string _ = "YES"; 132 +END 133 +CASE(8) 134 + int n = 2; 135 + int h0 = 0; 136 + int hn = 0; 137 + string history = "DU"; 138 + string _ = "NO"; 139 +END 140 +} 141 +// END CUT HERE
Added SRM/557-U/1B.cpp version [4ecece454e78d448]
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 +using namespace std; 18 +typedef long long LL; 19 +typedef long double LD; 20 +typedef complex<LD> CMP; 21 + 22 +typedef int vert; 23 +typedef vert edge; 24 +typedef vector<edge> edges; 25 +typedef vector<edges> graph; 26 + 27 +bool augment( graph& G, int v, vector<vert>& matchTo, bool visited[] ) 28 +{ 29 + for(int i=0; i<G[v].size(); ++i) { 30 + vert u = G[v][i]; 31 + if( visited[u] ) continue; 32 + visited[u] = true; 33 + 34 + if( matchTo[u]<0 || augment(G, matchTo[u], matchTo, visited) ) 35 + { matchTo[v]=u, matchTo[u]=v; return true; } 36 + } 37 + return false; 38 +} 39 + 40 +template<int NV> 41 +int biMatch( graph& G, int L ) // [0,L):left, [L,?):right 42 + // only left->right edges are used during computation 43 +{ 44 + vector<vert> matchTo(G.size(), -1); 45 + int ans = 0; 46 + for(vert v=0; v<L; ++v) { 47 + bool visited[NV] = {}; 48 + if( augment(G, v, matchTo, visited) ) 49 + ++ans; 50 + } 51 + return ans; 52 +} 53 + 54 +class Incubator { public: 55 + int maxMagicalGirls(vector <string> love) 56 + { 57 + const int N = love.size(); 58 + vector< vector<int> > protects(N, vector<int>(N, false)); 59 + for(int i=0; i<N; ++i) 60 + for(int j=0; j<N; ++j) 61 + protects[i][j] = (love[i][j] == 'Y'); 62 + for(int k=0; k<N; ++k) 63 + for(int i=0; i<N; ++i) 64 + for(int j=0; j<N; ++j) 65 + protects[i][j] |= protects[i][k] & protects[k][j]; 66 + 67 + int cand = N; 68 + 69 + graph G(N*2); 70 + for(int i=0; i<N; ++i) 71 + if(protects[i][i]) { 72 + --cand; 73 + } else { 74 + for(int j=0; j<N; ++j) 75 + if(protects[i][j] && !protects[j][j]) 76 + G[i].push_back(N+j); 77 + } 78 + 79 + return cand - biMatch<512>(G, N); 80 + } 81 +}; 82 + 83 +// BEGIN CUT HERE 84 +#include <ctime> 85 +double start_time; string timer() 86 + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 87 +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 88 + { os << "{ "; 89 + for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 90 + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 91 +void verify_case(const int& Expected, const int& Received) { 92 + bool ok = (Expected == Received); 93 + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 94 + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 95 +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 96 +#define END verify_case(_, Incubator().maxMagicalGirls(love));} 97 +int main(){ 98 + 99 +CASE(0) 100 + string love_[] = {"NY","NN"}; 101 + vector <string> love(love_, love_+sizeof(love_)/sizeof(*love_)); 102 + int _ = 1; 103 +END 104 +CASE(1) 105 + string love_[] = {"NYN", "NNY", "NNN"}; 106 + vector <string> love(love_, love_+sizeof(love_)/sizeof(*love_)); 107 + int _ = 1; 108 +END 109 +CASE(2) 110 + string love_[] = {"NNYNN","NNYNN","NNNYY","NNNNN","NNNNN"}; 111 + vector <string> love(love_, love_+sizeof(love_)/sizeof(*love_)); 112 + int _ = 2; 113 +END 114 +CASE(3) 115 + string love_[] = {"NNNNN","NYNNN","NYNYN","YNYNN","NNNNN"}; 116 + vector <string> love(love_, love_+sizeof(love_)/sizeof(*love_)); 117 + int _ = 2; 118 +END 119 +CASE(4) 120 + string love_[] = {"NNNNN","NNNNN","NNNNN","NNNNN","NNNNN"}; 121 + vector <string> love(love_, love_+sizeof(love_)/sizeof(*love_)); 122 + int _ = 5; 123 +END 124 +CASE(5) 125 + string love_[] = {"NNYNNNNN","NNNYNNNN","NNNNYNNN","NNYNNNNN","NNNNNYYN","NNNYNNNY","NNNNNNNN","NNNNNNNN"}; 126 + vector <string> love(love_, love_+sizeof(love_)/sizeof(*love_)); 127 + int _ = 2; 128 +END 129 +CASE(6) 130 + string love_[] = {"Y"}; 131 + vector <string> love(love_, love_+sizeof(love_)/sizeof(*love_)); 132 + int _ = 0; 133 +END 134 +CASE(7) 135 + string love_[] = {"NYNNN", "NNYNN", "NNYYY", "NNYYY", "NNYYY"}; 136 + vector <string> love(love_, love_+sizeof(love_)/sizeof(*love_)); 137 + int _ = 1; 138 +END 139 +CASE(8) 140 +string love_[] = {"NNYYYYY", "NNYYYYY", "NNNNNNN", "NNNYYYY", "NNNYYYY", "NNNYYYY", "NNNYYYY"}; 141 + vector <string> love(love_, love_+sizeof(love_)/sizeof(*love_)); 142 + int _ = 2; 143 +END 144 +} 145 +// END CUT HERE