[Notes] 手工栈技巧

其实很久之前的东西了,可是最近一直懒得更,为了以后好查看还是更一下

最近做一个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;
}

其实改动也不是很大是吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值