#include #include #include #include #include #include #include #include #include using namespace std; #define VIT(i, v) for (i = 0; i < v.size(); i++) #define IT(it, ds) for (it = ds.begin(); it != ds.end(); it++) #define FUP(i, n) for (i = 0; i < n; i++) #define O1(v) cout << v << endl #define O2(v1, v2) cout << v1 << " " << v2 << endl #define O3(v1, v2, v3) cout << v1 << " " << v2 << " " << v3 << endl #define OVEC(v) { int iii; VIT(iii, v) cout << v[iii] << " " ; cout << endl; } typedef vector IVec; typedef vector LLVec; class IncreasingSubsequences { public: long long count(vector a); }; long long IncreasingSubsequences::count(vector a) { vector edges; LLVec npaths; IVec nincident; int i, j, k; int maxsofar; IVec tsq; long long retval; /* Make the graph */ nincident.resize(a.size(), 0); npaths.resize(a.size(), 0); edges.resize(a.size()); VIT(i, a) { maxsofar = 1000000001; for (j = i+1; j < a.size(); j++) { if (a[j] > a[i] && a[j] < maxsofar) { edges[i].push_back(j); nincident[j]++; maxsofar = a[j]; } } } /* Set up the topological sort */ VIT(i, nincident) if (nincident[i] == 0) { npaths[i] = 1; tsq.push_back(i); } /* Do the topological sort */ retval = 0; VIT(k, tsq) { i = tsq[k]; printf("processing node %d(%d) -- # paths = ", i, a[i]); cout << npaths[i] << endl; VIT(j, edges[i]) { nincident[edges[i][j]]--; npaths[edges[i][j]] += npaths[i]; if (nincident[edges[i][j]] == 0) tsq.push_back(edges[i][j]); } if (edges[i].size() == 0) { retval += npaths[i]; } } return retval; }