CodeChef submission 61418 (C++ 4.0.0-8) plaintext list. Status: AC, problem E5, contest . By srihari (Srihari), 2009-07-31 00:45:58.
#include<cstdio> #include<algorithm> #define CATALANSIZE 31 using namespace std; long long derivedCatalanNumbers[CATALANSIZE][CATALANSIZE]; inline void initializeDerivedCatalanNumbers() { derivedCatalanNumbers[1][1] = derivedCatalanNumbers[1][0] = derivedCatalanNumbers[0][0] = 1L; int i, j; for (i=2; i<CATALANSIZE; ++i) { derivedCatalanNumbers[i][i] = 1L; for (j=i-1; j>0; --j) { derivedCatalanNumbers[i][j] = derivedCatalanNumbers[i][j+1] + derivedCatalanNumbers[i-1][j-1]; } derivedCatalanNumbers[i][0] = derivedCatalanNumbers[i][1]; } } int prefix[CATALANSIZE]; struct state { int ind; int maxLen; bool operator<(const state& other) const { return ((maxLen < other.maxLen) || ((maxLen == other.maxLen) && (ind < other.ind))); } }; state states[CATALANSIZE]; inline void resetStates(int m) { for (int i=0; i<m; ++i) { states[i].maxLen = 0; } } int numbersSmallerThanButNotInPrefix[CATALANSIZE]; inline void resetNumArray(int n) { for (int i=0; i<n; ++i) { numbersSmallerThanButNotInPrefix[i] = i; } } int main() { initializeDerivedCatalanNumbers(); int T; int n, m; int i, j; int maxLen; for (int t=0; t<T; ++t) { resetNumArray(n); for (i=0; i<m; ++i) { for (j=prefix[i]; j<n; ++j) { numbersSmallerThanButNotInPrefix[j]--; } } // find all longest decreasing subsequences in the prefix resetStates(m); for (i=0; i<m; ++i) { states[i].ind = prefix[i]; maxLen = 0; for (j=0; j<i; ++j) { if (states[i].ind < states[j].ind) { if (states[j].maxLen > maxLen) { maxLen = states[j].maxLen; } } } states[i].maxLen = maxLen+1; } sort(states, states+m); // no decreasing subsequence in prefix if ((m==0) || (states[m-1].maxLen == 0)) { continue; } // 3+ sized decreasing subsequence already in prefix. if (states[m-1].maxLen > 2) { continue; } for (i=m-1; i>=0; --i) { // 2-size decreasing subsequence in prefix has a // 100 % chance of completing trio in the suffix if ((states[i].maxLen == 2) && (numbersSmallerThanButNotInPrefix[states[i].ind-1] > 0)) { break; } if (states[i].maxLen == 1) { // SOLUTION break; } } // shouldn't have come here empty handed in the first place.. // i.e. (i > 0) always as solution should have been found. } return 0; }
Comments

