骚操作:c++如何用goto便捷地写人工栈?
在如今所有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 --;
}
}
这样改的好处是并不用做特别多的修改,且不容易改错,是一种简单的人工栈写法。
骚操作:c++如何用goto便捷地写人工栈?的更多相关文章
- 如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)
0x01 问题提出 还记得上篇文章记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门),我们讲到了一些PHP的一些如何巧妙地绕过数字和字母受限的技巧,今天我要给大家分享的是如 ...
- Typescript骚操作,在TS里面直接插入HTML
Typescript骚操作,在TS里面直接插入HTML,还有语法提示 先给大家看一个图 因为我不喜欢用很重的框架,主要是并非专业UI,但是偶尔会用到,还是觉得直接element组装受不了,想想能在ts ...
- 闪电侠 Netty 小册里的骚操作
前言 即使这是一本小册,但基于"不提笔不读书"的理念,仍然有必要总结一下.此小册对于那些"硬杠 Netty 源码 却不曾在千万级生产环境上使用实操"的用户非常有 ...
- awk骚操作
一.awk自加 [root@168web3 ~]# head /data/logs/cloud_monitor_rds_cpu.log |awk '{sum+=$NF}END{print sum}' ...
- UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)
题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...
- 关于map 及 map 骚操作
关于map这个东西 很冷门.................. 但是,这个博客带你稍微了解一下map: map用法:一般当作一个下表无穷大的数组 关于它的骚操作:map的鬼畜用法,可以 ...
- 通过HTTP的HEADER完成各种骚操作
作为一名专业的切图工程师,我从来不care网页的header,最多关心Status Code是不是200.但是HEADER真的很重要啊,客户端从服务器端获取内容,首先就是通过HEADER进行各种沟通! ...
- 洛谷 P1045 麦森数 (快速幂+高精度+算位数骚操作)
这道题太精彩了! 我一开始想直接一波暴力算,然后叫上去只有50分,50分超时 然后我改成万位制提高运算效率,还是只有50分 然后我丧心病狂开long long用10的10次方作为一位,也就是100亿进 ...
- Mac OS 上的一些骚操作
本帖记录个人在使用 Mac 操作系统上的一些骚操作,不断更新,以飨读者. 快速移动网页到顶部或底部 用双指上下划触摸板吗?NO,我们有更骚的操作: command + ↑ 回到顶部 command + ...
随机推荐
- JavaSE---多线程---线程组
1.概述 1.1 Java中使用ThreadGroup表示线程组,可以对一批线程进行分类管理: Java运行程序直接对 线程组 进行控制,对线程组的控制相当于 同时控制这组线程: 一旦线程加入某一组 ...
- leetcode-第14周双周赛-1274-矩形内船只的数目
题目描述: 自己的提交: # """ # This is Sea's API interface. # You should not implement it, or s ...
- Edge Computer:Vision and Challenges
Abstract 随着物联网(Internet of Things)的蓬勃发展和云服务(cloud services)的成功,出现一种新的计算模式:edge computer.用于边缘网络数据的处理, ...
- 每天一个linux命令:cp(8)
cp cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时, ...
- PHP filter_has_var() 函数
「大理石平台」大理石平台上的裂缝是怎么回事? 定义和用法 filter_has_var() 函数检查是否存在指定输入类型的变量. 如果成功则返回 TRUE,如果失败则返回 FALSE. 语法 filt ...
- [CSP-S模拟测试60]题解
回去要补一下命运石之门了…… A.嘟嘟噜 给定报数次数的约瑟夫,递推式为$ans=(ans+m)\% i$. 考虑优化,中间很多次$+m$后是不用取模的,这种情况就可以把加法变乘法了.问题在于如何找到 ...
- springmvc缓存 - cache
前几篇文章已经搭建了一个基本的springmvc demo,现在我们来完善下. 相信大家写程序的时候都接触过缓存的概念,也都知道,数据量大的时候缓存对于提高效率是很显著的.而缓存一般包括前台静态 ...
- 分布式调度框架TBSchedule使用方法
一.TBSchedule简介 TBSchedule是来自淘宝的分布式调度开源框架,基于Zookeeper纯Java实现,其目的是让一种批量任务或者不断变化的任务,能够被动态的分配到多个主机的JVM中的 ...
- 购买一台阿里云云主机(CentOS)后
系统的优化优化之前,首先查看版本信息 cat /etc/redhat-release CentOS release 6.9 (Final) 查看内核版本 uname -a Linux iZwz98ak ...
- Python变量的下划线
xx: 公有变量 _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问 __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部 ...