CodeChef submission 67737 (C++ 4.0.0-8) plaintext list. Status: AC, problem E5, contest . By dejandenib (Dejan), 2009-08-09 19:31:21.
#include <algorithm> #include <cassert> #include <cstdio> #include <cstdlib> #include <cctype> #include <cmath> #include <iostream> #include <sstream> #include <string> #include <utility> #include <vector> #include <cassert> #include <ctime> #include <queue> using namespace std; #define VAR(a,b) __typeof(b) a=(b) #define REP(i,n) for(int _n=n, i=0;i<_n;++i) #define FOR(i,a,b) for(int i=(a),_b=(b);i<=_b;++i) #define FORD(i,a,b) for(int i=(a),_b=(b);i>=_b;--i) #define FOREACH(it,c) for(VAR(it,(c).begin());it!=(c).end();++it) #define ALL(c) (c).begin(),(c).end() typedef long long LL; const int INF = 1000000000; const LL INFLL = LL(INF) * LL(INF); typedef vector<int> VI; typedef vector<string> VS; typedef vector<VI> VVI; template<class T> inline int size(const T&c) { return c.size(); } //}}} const int MAXN = 30; LL cache[MAXN+1][MAXN+1]; inline int nextz(int n,int z,int a) { if(a==0) return max(z-1,0); else if(a<=z) return -1; else return a-1; } LL calc(int n, int z) { LL &res = cache[n][z]; if(res != -1) return res; if(n==0) res=1; else { res = 0; REP(i,n) { int z2 = nextz(n,z,i); if(z2 != -1) res += calc(n-1, z2); } } return res; } int main() { int ntc = rint(); REP(tc,ntc) { int n = rint(); int plen = rint(); vector<int> p(plen); REP(i,plen) p[i] = rint()-1; int z = 0; LL res = 0; bool bad = false; REP(i,plen) { int a = p[i]; z = nextz(n,z,a); if(z==-1) { bad=true; break; } --n; FOREACH(it,p) if(*it > a) --*it; } if(!bad) res = calc(n,z); } }
Comments

