OI

  1. 对于有关环的问题,考虑两种处理方式
  • 枚举可能情况
  • 复制一份变为序列问题

警钟长鸣

容易两行泪的东西

  • 不会的时候看看是不是读错题了
  • 太会的时候看看是不是读错题了
  • 太会的时候最好确认一下算法假没假(手搓样例)
  • 多测不清空,抱灵两行泪
  • 交之前瞅一眼数据范围,检查所有乘法有没有可能爆
  • 对于带 mod 问题,检查所有减法有没有可能出负数 ×1\times 1
  • 手写队列注意够不够长(尤其注意spfa)

当你WA了调不出来

  • 打擂台初值没赋好 ×1\times 1
  • dp 初值没赋好 ×1\times 1
  • 读入写错了 ×2\times 2
  • 多测/二分check/重复利用行为 没清空 ×1\times 1
  • 段错误了不知道为啥九成越界 ×3\times 3
  • 做麻了的时候,重新缕一遍这题都要干什么并看看你的代码都干了什么 ×1\times 1
  • 交错题了 ×1\times 1
  • freopen没删/调试代码没删 ×2\times 2
  • 去重之后没换 nn ×1\times 1
  • 权值 DS 边界混淆 ×1\times 1
  • 树上问题注意区分 u v 和 father,别给自己绕进去了
  • 变量名写错了 ×1\times 1
  • 数组 NM 写反了 ×1\times 1

CE

  1. “xxx的声明指定了两个以上的数据类型”:结构体等后面没写分号
  2. ISO C++ 不允许声明无类型的‘xxx’ [-fpermissive] 注意自定义类型名是不是写错了
  3. 永远不要忘了,std::lower_bound 返回的是指针

WA/RE

  1. 注意字符串起始位置
  2. std::pq 默认大根
  3. 栈区定义的数据结构有没有初始化

本地测试技巧

  1. size ./work 执行 size ./work 命令会输出类似以下格式的信息:
  • text: 可执行文件中的代码段(text segment)的大小,即程序的机器指令部分的大小。
  • data: 已初始化的全局变量和静态变量的大小,包括数组的已初始化部分
  • bss: 未初始化的全局变量和静态变量所占用的空间大小
  • dec: 文件总大小的十进制表示。
  • hex: 文件总大小的十六进制表示。
  • filename: 可执行文件的名称。

bool f1; int a[1000000]; bool f2; cout<<(&f2-&f1)/ 1024.0;

  1. ulimit -s [KB]/unlimited 老生常谈的栈空间
  2. -fsanitize=address,undefined

码字常用寄巧

令人舒适的矩阵(常用于矩阵乘法)

struct matrix
{
    struct line
    {
        int a[12];
        inline int& operator[](const int &idx) { return a[idx]; }
    };
    line a[12];
    inline line& operator[](const int &idx) { return a[idx]; }
};

除法与右移

  • 右移向下取整,除法向0取整

常用函数

  1. scanf("\n %d \n",a); 在scanf中添加空格或者\n的意义都是忽略所有空白字符,而不是忽略一个换行符或者一个空格 在前后都一样

cout.precision(6); // 设置精度 cout.setf(ios::fixed); // 精度指小数点后位数 使用一般方式输出浮点数 cout.unsetf(ios::fixed); // 精度指有效数字位数 系统可能使用E来表示浮点数 cout.setf(ios::showpoint); // 输出小数部分的后置零 unsigned long long tmp[10];
memset(tmp, 0, sizeof(tmp)); // 0000 0000 memset(tmp, -1, sizeof(tmp)); // 1111 1111 memset(tmp, 0x3f, sizeof(tmp)); // 1e9 / 4e18 量级 相加不爆 0011 1111 memset(tmp, 0x7f, sizeof(tmp)); // 2e9 / 9e18 量级 相机会爆 0111 1111 memset(tmp, 0xc0, sizeof(tmp)); //-1e9 / 4e18 量级 相机不爆 1011 0000 memset(tmp, 128, sizeof(tmp)); //-2e9 / 9e18 量级 相加会爆 1000 0000 // unsigned 类型现推就行 相加不爆 0x7f 最大值0xff memcpy(target + 1, text + 1, sizeof(int) * len); memcpy(target, text, sizeof(text)); std::reverse(a, a + 9); // 区间反转 左闭右开 std::unique(a, a + 9); // 去重 左闭右开 返回第一个重复元素的指针 exit(0); // 结束程序 std::random_device seed; unsigned int sd = seed(); std::mt19937 rd; rd.seed(sd); rd.operator()(); std::lower_bound(a+1,a+1+n,val);(大于等于,返回指针) __builtin_popcount(j)

一些奇奇怪怪的关键字

  • mutable 关键字,修饰的变量将永远处于可修改状态(包括在const类或函数里) immutable 与之相对,详见link 应用:Chtholly Tree

lambda 表达式

  • 基本格式 [捕获列表] (参数列表) -> 返回类型 {函数主体}
  • 捕获列表 [] 不捕获任何外部变量 [=] 按值捕获全部外部变量 [&] 按址捕获全部外部变量 [=,&a] 除a按址捕获,按值捕获其他变量 [&,a] 除a按值捕获,按址捕获其他变量 [a,&b] 按值捕获a,按址捕获b
  • 省略 返回类型和前面的->可以省略,编译器自动推断返回类型