其实很久之前的东西了,可是最近一直懒得更,为了以后好查看还是更一下
最近做一个OJ,系统栈有点小?
然后在fls的教导下,自己YY用goto和define写出了奇怪的代码
自我感觉还很优美?
就是这样一个函数
inline void dfs(int u){
if (vst[u]) return;
vst[u]=1; f[u]=abcd(u,u);
while (1){
abcd pre=f[u];
if (f[u].R<n && jud(f[u].L,f[u].R,c[f[u].R])){
int v=f[u].R+1;
dfs(v); f[u].L=min(f[u].L,f[v].L),f[u].R=max(f[u].R,f[v].R);
}
if (f[u].L>1 && jud(f[u].L,f[u].R,c[f[u].L-1])){
int v=f[u].L-1;
dfs(v); f[u].L=min(f[u].L,f[v].L),f[u].R=max(f[u].R,f[v].R);
}
if (f[u]==pre) break;
}
}
被写成了这样
int sta[N],pt[N],pnt;
int tmp1[N]; abcd tmp2[N];
int ag1,ag2;
inline void dfs(int start){
#define u sta[pnt]
#define v tmp1[pnt]
#define pre tmp2[pnt]
#define back pt[pnt]
ag1=start; ag2=-1;
S:
++pnt;
u=ag1; back=ag2;
if (vst[u]){
if (back==0){ pnt--; goto W0; }else if (back==1){ pnt--; goto W1; } else return;
}
vst[u]=1; f[u]=abcd(u,u);
while (1){
pre=f[u];
if (f[u].R<n && jud(f[u].L,f[u].R,c[f[u].R])){
v=f[u].R+1;
ag1=v; ag2=0; goto S;
W0:
f[u].L=min(f[u].L,f[v].L),f[u].R=max(f[u].R,f[v].R);
}
if (f[u].L>1 && jud(f[u].L,f[u].R,c[f[u].L-1])){
v=f[u].L-1;
ag1=v; ag2=1; goto S;
W1:
f[u].L=min(f[u].L,f[v].L),f[u].R=max(f[u].R,f[v].R);
}
if (f[u]==pre) break;
}
if (back==0){ pnt--; goto W0; }else if (back==1){ pnt--; goto W1; } else return;
}
其实改动也不是很大是吧