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 了,n 是 105 级别,经过各种调试后确认就是这部分预处理太慢了。
然后我稍微交换了下循环顺序,变成下面这样:
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 不到。
为什么循环顺序会对运行效率产生这么大的影响,这是什么原理,卡常卡了老半天最后发现是这里的问题实在是绷不住了。