骚操作:c++如何用goto便捷地写人工栈?

2023-11-09

在如今所有NOI系列赛事已经开全栈的时势下,人工栈已经离我们很远很远。

所以这博客就是我弄着玩的。

首先我们要清楚的是c++的goto写法:

loop:;
…
goto loop;

在运行到goto时,就会跳到对应的标记,标记在goto的前后都可以。

然而你试着试着却发现编译错误了,

原因是loop和goto之间不能有新加变量(递归也是新加变量)的操作,你可以想象你的代码里不能int k两次。

那我们到底该怎么改呢,举个例子?

遍历树的:

void dg(int x) {
    siz[x] = 1;
    for(int i = fi[x]; i; i = nt[i]) {
        int y = to[i];
        if(y == fa[x]) continue;
        fa[y] = x;
        dg(y);
        siz[x] += siz[to[i]];
    }
}

1.把递归里所有用到变量都在开头定义。

void dg(int x) {
    int i, y;
    siz[x] = 1;
    for(i = fi[x]; i; i = nt[i]) {
        y = to[i];
        if(y == fa[x]) continue;
        fa[y] = x;
        dg(y);
        siz[x] += siz[to[i]];
    }
}

2.新命名这些变量,包括dg里的参数,存到数组里,多开一个type表示当前程序应该从哪里开始。

int z0, ty[N], zx[N], zi[N], zy[N];

3.用while循环实现递归过程。

while循环开始加载所有变量,然后开始goto。

在每次递归前都把当前所有用到的变量记下来,当前位置记好,下一层的开好,跳回开头,递归后设一个标记,以便之后跳过来。

int z0, ty[N], zx[N], zi[N], zy[N];
void dg(int x) {
    ty[++ z0] = 0, zx[z0] = x;
    while(z0) {
        loop0 :;
        int x = zx[z0], i = zi[z0], y = zy[z0];
        if(ty[z0] == 1) goto loop1;
        siz[x] = 1;
        for(i = fi[x]; i; i = nt[i]) {
            y = to[i];
            if(y == fa[x]) continue;
            fa[y] = x;
            
            zx[z0] = x, zi[z0] = i, zy[z0] = y, ty[z0] = 1;
            ty[++ z0] = 0, zx[z0] = y;
            goto loop0;
            //dg(y);
            loop1 :;

            siz[x] += siz[to[i]];
        }
        z0 --;
    }
}

这样改的好处是并不用做特别多的修改,且不容易改错,是一种简单的人工栈写法。

转载于:https://www.cnblogs.com/coldchair/p/11605259.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

骚操作:c++如何用goto便捷地写人工栈? 的相关文章

  • 丢手帕问题

    package Task author 链表解决丢手帕问题 约瑟夫问题 public class CycLink public static void main String args CycLinkModel cycLink new Cy
  • Vue3.x 中 vue.config 配置 Webpack-dev-server的proxy 实现代理跨域

    前言 如果你有单独的后端开发服务器 API 并且希望在同域名下发送 API 请求 那么代理某些 URL 会很有用 解决开发环境的跨域问题 不用在去配置nginx和host 爽歪歪 在webpack config js中配置 下面简单介绍一下

随机推荐

  • MySQL锁系列(八)之 死锁

    能学到什么 什么是死锁 死锁有什么危害 典型的死锁案例剖析 如何避免死锁 一 什么是死锁 1 必须满足的条件 1 2 1 必须有两个或者两个以上的事务 2 不同事务之间都持有对方需要的锁资源 A事务需要B的资源 B事务需要A的资源 这就是典
  • Protobuf(二)proto3语法格式

    proto文件有两种语法标准 proto2和proto3 我们以proto3为例 其语法格式如下 message
  • 什么是软件测试?

    什么是软件测试 软件测试的定义 在一定条件下对软件进行操作 发现软件的问题 提高软件的质量 软件测试在开发中的有着重要地位 软件测试在各阶段的完成相应的任务 需求测试 架构测试 详细测试等 随着测试的发展 测试技术有了新的支持和扩充CMMI
  • Spline interpolation and Savitzki-Golay smoothing

    转自 http octave 1599824 n4 nabble com Spline interpolation and Savitzki Golay smoothing td1675136 html natural cubic spli
  • QT---窗口、按钮的基本设置

    目录 一 窗口相关的设置及中文编译错误设置 1 在源文件widget cpp中进行修改数据 并创建有关界面 2 如遇中文编译错误 即标题中文显示乱码 可如下设置 3 窗口界面及标题设置 窗口是否拉伸 二 创建按钮的相关设置 1 添加头文件
  • mybatis使用resultMap自定义映射处理,处理多对一的映射关系:

    1 级联方式处理
  • UML 中九种图

    UML 中九种图 1 用例图 说明 由参与者 actor 用例 User Case 以及他们之间的关系构成 用来描述系统功能 作用 可视化表达系统需求 更直观 规范 客服纯文字说明不足 图示 2 类图 说明 类 Class 封装了数据和行为
  • 数据结构 线性表的顺序存储和链式存储,以及基本操作、单链表例题

    一 线性表的存储表示 1 顺序表 线性表的顺序表示又称为顺序表 顺序表的静态分配存储表示 线性表的静态分配顺序存储结构 typedef int ElemType typedef struct 顺序表的定义 ElemType elem LIS
  • 2023Go面试问答_Go基础

    与其他语言相比 使用 Go 有什么好处 与其他作为学术实验开始的语言不同 Go代码的设计是务实的 每个功能和语法决策都旨在让程序员的生活更轻松 Golang 针对并发进行了优化 并且在规模上运行良好 由于单一的标准代码格式 Golang 通
  • Android开发中Handler的经典总结

    一 Handler的定义 主要接受子线程发送的数据 并用此数据配合主线程更新UI 解释 当应用程序启动时 Android首先会开启一个主线程 也就是UI线程 主线程为管理界面中的UI控件 进行事件分发 比如说 你要是点击一个 Button
  • 关于Redis配置主从复制遇到的问题,从机连接到主机,主机显示的从机数量仍然为0

    问题 设置单机集群的时候 两台从机都显示连接到主机 但是主机显示连接到的从机数量为0 主机79 从机80 从机81 解决 主库master要求密码验证 因为之前配置了redis的密码 方法一 建议 在配置文件中将requirepass注释掉
  • 云计算常用命令

    云计算IAAS篇 mysql篇 mysql uroot p000000 使用root账号登录mysql use mysql 切换到mysql层 show tables 查询mysql数据库列表 select from mysql user
  • 记一次阿里云黑客攻击事件

    这几天服务器一直发生异常行为 阿里云报警如下 根据执行命令 bin sh c curl fsSL http 165 225 157 157 8000 i sh sh 可知道 后台某个进程一直从这个美国的IP地址下载sh可执行文件 访问这个地
  • SpringMVC:从入门到精通,7篇系列篇带你全面掌握--四.5分钟搞定文件上传与下载

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于SpringMVC的相关操作吧 需要添加的依赖
  • Android Studio安装及环境配置教程

    前言 首先需要确定好电脑是否有安装java环境 即是否安装有JDK 验证方法 直接电脑桌面win R 输入cmd 然后在黑窗口中分别输入java javac javadoc java version enter键 注意是输入一个指令按一次e
  • 【前端|CSS系列第4篇】面试官:你了解居中布局吗?

    欢迎来到前端CSS系列的第4篇教程 如果你正在寻找一种简单而又强大的前端技术 以使你的网页和应用程序看起来更加专业和美观 那么居中布局绝对是你不能错过的重要知识 在前端开发中 实现居中布局是一项必备技能 无论是垂直居中 水平居中 还是同时实
  • python函数中的可变默认值

    In 27 def f a a append 5 print a In 28 P f 5 In 29 L f 5 5 函数多次调用竟然使用的用一个参数对象 请注意
  • 大数据数据库:MPP vs MapReduce

    这些年大数据概念已经成为IT界的热门 我们经常也会在新闻和报纸中看到 大数据概念中最为关键的技术就是数据库管理系统 伴随着hadoop和MapReduce技术的流行 大数据的数据库中Hive和Spark等新型数据库脱颖而出 而另一个技术流派
  • javafx服务器监控系统,用于服务器端图像生成的JavaFX

    这可能听起来很奇怪 但我想使用JavaFX在服务器端生成我的图表图像 因为JavaFX具有很好的canvas API来执行图像转换连接和定位 特别是我有一个spring MVC服务来生成我的图表作为图像 主要问题是如何从方便的Spring
  • 骚操作:c++如何用goto便捷地写人工栈?

    在如今所有NOI系列赛事已经开全栈的时势下 人工栈已经离我们很远很远 所以这博客就是我弄着玩的 首先我们要清楚的是c 的goto写法 loop goto loop 在运行到goto时 就会跳到对应的标记 标记在goto的前后都可以 然而你试