为什么这里 vector 比数组慢 10 倍
  • 板块学术版
  • 楼主liyixin0514
  • 当前回复30
  • 已保存回复31
  • 发布时间2025/1/5 20:19
  • 上次更新2025/1/6 15:52:25
查看原帖
为什么这里 vector 比数组慢 10 倍
542128
liyixin0514楼主2025/1/5 20:19

两段代码均正确。n35,lim=26n \le 35,lim=26

n=23n=23n=35n=35 的数据下,使用 vector 都比使用数组慢将近 1010 倍。下面描述 n=23n=23 的情况。

保证 rkrk 数组恒等于 00,保证没有数组越界。

完整代码放二楼。

第一段代码使用数组:

全局变量 s=0s=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=1s=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);
}
2025/1/5 20:19
加载中...