两段代码均正确。n≤35,lim=26。
在 n=23 和 n=35 的数据下,使用 vector 都比使用数组慢将近 10 倍。下面描述 n=23 的情况。
保证 rk 数组恒等于 0,保证没有数组越界。
完整代码放二楼。
第一段代码使用数组:
全局变量 s=0。
int n,p[N],rk[N];
int s;
struct zt {
int x[35-lim+1];// 这个数组
bool operator < (const zt b) const {
rep(i,0,s) if(x[i]!=b.x[i]) return x[i]<b.x[i];
return 0;
}
}t;
map<zt,ll> mp[N][N*N];
vi vec;
void dfs(int u,int n,int len,int w) {
if(u==n+1) {
mp[len][w][t]++;
return;
}
dfs(u+1,n,len,w);
int sum=0;
for(int v : vec) if(v>p[u]) ++sum;
w+=sum; t.x[rk[u]]++; vec.push_back(p[u]);
dfs(u+1,n,len+1,w);
w-=sum; t.x[rk[u]]--; vec.pop_back();
}
void solve1(int n) {
dfs(1,n,0,0);
}
第二段代码使用 vector:
全局变量 s=1。
int n,p[N],rk[N];
struct zt {
vector<int> x;// 这个 vector
bool operator < (const zt b) const {
int s=x.size();
rep(i,0,s-1) if(x[i]!=b.x[i]) return x[i]<b.x[i];
return 0;
}
}t;
map<zt,ll> mp[N][N*N];
vi vec;
void dfs(int u,int n,int len,int w) {
if(u==n+1) {
mp[len][w][t]++;
return;
}
dfs(u+1,n,len,w);
int sum=0;
for(int v : vec) if(v>p[u]) ++sum;
w+=sum; t.x[rk[u]]++; vec.push_back(p[u]);
dfs(u+1,n,len+1,w);
w-=sum; t.x[rk[u]]--; vec.pop_back();
}
void solve1(int n,int s) {
t.x.resize(s);
dfs(1,n,0,0);
}