ACM算法比赛常用宏定义、声明定义及其说明

本文详细介绍了算法竞赛中常用的宏定义,包括#define debug(a)用于调试、#define lyh(i,a,b)和#define hyl(i,a,b)实现不同方向的for循环,以及LL、memset、EPS、INF等常量定义,旨在提升代码效率和可读性。同时,提到了ios::sync_with_stdio(0)用于加速输入输出。
摘要由CSDN通过智能技术生成


前言

在算法竞赛中,我们如果能够正确地使用宏定义的代码,能够加快我们的解题速度,与此同时,也能够加强我们所写代码的可读性,在我们测试和调整代码的时候,也可以变得更方便。

对于一般的变量定义,我们通常使用宏定义 #define或者类型定义typedef来对诸如long long、unsigned long long等变量类型较长的变量进行定义。

下面,我们将针对算法竞赛中常用的一些头文件以及变量定义进行总结和说明


一、头文件定义以及说明

1. #define debug(a)

代码如下:

#define debug(a) cout<<#a<<"="<<a<<endl;

作用: 主要用于程序的测试和调试中,比如在某个循环中,我们可以输出并观察a的值

语法说明: 在cout<<#a<<"="<<a<<endl语句中,在a的前面加上#号,是表示将a作为编程字符串,类似于int a,主要是作为一个变量使用,a的作为形参出现在宏定义中,宏是可以带形参的,像函数一样,这个a就是上面这个宏debug的形参,它也会展开,如果没有加#,编译器则会认为a不是一个变量字符串,这样就会使得编译器报错。


2. #define lyh(i,a,b) for(int i=a;i<=b;i++)

代码如下:

#define lyh(i,a,b) for(int i=a;i<=b;i++)

作用: 模拟for循环,以变量i=a为初始值从a到b进行正向迭代,由小到大(i是递增的)


3. #define hyl(i,a,b) for(int i=a;i>=b;i–)

代码如下:

#define hyl(i,a,b) for(int i=a;i>=b;i--)

作用: 反向模拟for循环,以变量i=a为初始值从a到b进行反向迭代,由大到小(i是递减的)


4. #define LL long long

代码如下:

#define LL long long
//或
typedef long long LL

#define ULL unsigned long long
//或
typedef unsigned long long ULL

作用: 定义长长整型类型的变量,增强代码的可读性

c++中常用的几种数据类型的大小范围如下表所示(主要参照为Visual Studio 2019 64位的编译器)

类型存储空间大小最小值最大值
(signed)char1个字节-128127
unsigned char1个字节0255
int2个或4个字节-2 147 483 6482 147 483 647
unsigned int2个或4个字节04 294 967 295
short2个字节-32 76832 767
unsigned short2个字节065 535
long4个字节-2 147 483 6482 147 483 647
unsigned long4个字节04 294 967 295
long long (C99)8个字节-9 223 372 036 854 775 8089 223 372 036 854 775 807
Unsigned long long (C99)8个字节018 446 744 073 709 551 615

5. #define mm memset

代码如下:

#define mm memset

作用: 定义常用的初始化函数menset,包含在<string.h>或者 < c s t r i n g > <cstring> <cstring>头文件中

语法说明:

  • 函数原型:
# include <string.h>
void *memset(void *s, int c, unsigned long n);
  • 函数功能:
    将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,由于指针变量s是void型,所以它可以为任何类型的数据进行初始化操作,例子可以观摩这篇博文 memset函数及其用法,C语言memset函数详解

  • 用法示例:

int flag[50];
memset(flag, -1, sizeof(flag));	//将标志数组初始化

6. #define EPS 1e-8

代码如下:

#define EPS 1e-8

作用: 定义整数的最小值 1 − 8 1^{-8} 18


7. #define INF 0x7fffffff

代码如下:

#define INF 0x7fffffff

作用: 定义整数的的最大值,十六进制7fffffff


8. #define INF 0x7fffffff

代码如下:

#define INF 0x7fffffff

作用: 定义整数的的最大值,十六进制7fffffff


9. ios::sync_with_stdio(0);

代码如下:

ios::sync_with_stdio(0);

作用: 取消cin与stdio标准库的同步,加快cin、cout的反应速度,加速c++输入输出流,详情可以看这位博主的文章 关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流

二、综合

当我们将上述文件综合起来,有如下代码 (方便各位同志们复制粘贴代码)

#define debug(a) cout<<#a<<"="<<a<<endl;
#define lyh(i,a,b) for(int i=a;i<=b;i++)
#define hyl(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define mm memset
#define EPS 1e-8
#define INF 0x7fffffff
using namespace std;
//ios::sync_with_stdio(0);	//需要用的时候可以解除封印
//======================================

注:这篇文章是动态记录的,如果作者在学习的路上还遇到其他有用的宏定义也会在后续添加到文章当中


写在最后

各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟! <(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值