萌新求助关于循环顺序对常数的影响
  • 板块学术版
  • 楼主KingPowers
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/11/1 16:53
  • 上次更新2023/11/2 10:25:14
查看原帖
萌新求助关于循环顺序对常数的影响
530180
KingPowers楼主2023/11/1 16:53

RT,刚刚在补某道模拟赛题,其中有一部分预处理的代码如下:

#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rof(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1e5+50;
int n,r[N][19][51];
void init(){
	For(k,2,50) For(j,1,18) For(i,1,n)
		r[i][j][k]=r[r[i][j-1][k]][j-1][k];
}

然后上面这部分代码在 4000ms 的时限下光荣地 TLE 了,nn 是 10510^5 级别,经过各种调试后确认就是这部分预处理太慢了。

然后我稍微交换了下循环顺序,变成下面这样:

void init(){
	For(j,1,18) For(i,1,n) For(k,2,50)
		r[i][j][k]=r[r[i][j-1][k]][j-1][k];
}

相比之前直接跑得飞快,用了 1000ms 不到。

为什么循环顺序会对运行效率产生这么大的影响,这是什么原理,卡常卡了老半天最后发现是这里的问题实在是绷不住了。

2023/11/1 16:53
加载中...