做题经验

语法类

  • \(\color{red}{!!!!!!!!!!!!!}\)开ll时,左移右移等位运算,注意要写 1ll**

  • 最好是只要有常数就加上ll;

  • 数学题精度开高!!能用long double就用,loglogl, ceilceill.

  • 形如:

a[i] += k % MOD; 
a[i] %= MOD

带取模的 加/乘 运算,可以变形为 a[i] = (a[i] + k % MOD) % MOD

  • .size()返回的不是整形,注意强转

  • 如期望dp等数很大需要取模的题,一定要开long long,同时细心计算哪些地方可以在不超long long的前提下先不取模,能极大地优化常数

  • 在需要把数组赋初值为INF时:

    • 题目数据范围在int内,循环赋成0x7fffffff
    • 题目数据范围在1e9内,用memset(xx, 0x3f, sizeof(xx))是安全的
  • 赋值运算符先运行右边,注意顺序,例如

    • a[rd] = rd;此类写法,会先读入要赋的值而非要用的下标
    • a[tot] = a[tot++]; 等价于 a[tot+1] = a[tot], tot++;
  • memset(xx, 128, sizeof(xx)) 会赋为负无穷

  • memset(xx, 255, sizeof(xx)) 会赋为-1,此时对数组只能赋值不能直接加

  • sizeof里记得写数组名,千万别写 sizeof(Fill)

  • 打快读的时候注意给处理乘10的位运算加括号

  • multiseterase 是删除所有与给定值相等的数

  • lowerbound/unique 等函数,减掉数组开始位置的指针得到位置下标。

  • &^|三个位运算优先级比关系运算(>=、<=、==)低,位移运算比关系运算高,多加括号

  • cerr不删不影响正确性,但是影响运行速度

  • cmp里面必须是严格弱序,二元关系要满足反自反性、非对称性、传递性、可比性

  • 结构体的赋值不写在括号里的强制为0

  • -2147483648是一个表达式,是对 2147483648 取负值,在int范围内溢出,要写 -2147483647 - 1

  • 为防止与 00000000 重复,将10000000定义为-128

  • 二进制相关:
    INT_MAX + 1 = INT_MIN
    0111 1111 + 0000 0001 = 补码 0111 1111 + 补码0000 0001 = 补码 1000 0000 = -128
    INT_MIN - 1 = INT_MAX
    INI_MIN + 1000 0001 = 补码1000 0000 + 补码 1111 1111 = 补码 0111 1111 = 127
    abs(INT_MIN) = INT_MIN

特定算法

  • 数据结构尤其是堆一类数据结构注意大于小于符号方向,尽量统一查询数的位置,放在左边

  • 写平衡树查询比某值小的个数时,返回1,有效避免查询值在平衡树中不存在导致返回值比正确结果少1的情况

  • 扫描线面积并 \(X,lines\) 数组开 \(2n\)。线段树开 \(8n\),线段树本身需要 \(4n\),扫描线题目每个矩形会有两个需要记录的 \(x\) 坐标总共是 \(4n \times 2\)

  • 需要注意的是,图论题目,尤其是无向图需要建正反两条有向边的,与边数相关的数组要开两倍!!!!!!!

  • 扫描线周长并重载运算符时注意到当纵坐标相同时,应先处理出边再处理入边,空间与面积并相同

  • 有关矩形的题目读入时注意 \(x1, y1, x2, y2\) 四个坐标的读入顺序

  • Floyd 最外层必须枚举k

  • 线段树pushdown中的判断在很多题中不是必须的,在一些题中必须删去,注意甄别,不要忘记pushdown!!!

  • dfs注意处理父亲、自身及儿子状态时的冲突,先后顺序,最好是手摸一下

  • 区间 DP 要特别注意循环的边界

  • 区间 DP 可以使 dp[i][i - 1]dp[i + 1][i] 可以赋特殊值,就不用考虑边界问题(P1040)

  • 数学题关于实数二分精度设尽量高

  • BFS注意条件判断时先判下标合法,这样可以形成短路不运行后面判断语句,否则产生RE;还要特别注意,不管vis数组是否影响正确性都要用,因为它控制复杂度保证在点数量级

  • 主席树根节点的 RootCnt 和节点总数 NodeCnt 不能混用

  • 双指针要一直保证 l <= r

  • 写矩阵快速幂时注意初始化所有要用到的矩阵的宽高

  • 并查集可以在find函数中一边查找一边更新值,既实现了路径压缩又能维护值,注意要在find之后维护值,需要的是从fa回溯回来的结果 银河英雄传说

  • LCA同时往上跳以前特判是不是已经相等

  • 树剖用线段树维护的时候要用节点对应的dfn维护,他的线段树要注意特判l<=r

  • 树上问题一定记的初始化根节点(深度,权值,大小)

  • 写点双的时候记得特判单独一个点的情况,弹栈不能把割点弹出去

比赛经验

  • 注意多测时清空,多测输入及输出的格式,不要多输出换行

  • 比如无向图边数乘2,2-SAT点数乘2之类的拆边拆点问题,清空要注意不一定是到n和m

  • 多测为了降低初始化复杂度,有时需要在每次做完问题后根据某些状态清空另一些状态

  • 无论输出什么字符串,即使是YES``No,都要复制,以防前面这种形式不统一的情况

  • 循环变量别写串了

  • 打对拍最左边是exe,中间是数据,最右边是输出
    std.exe<data.txt>std.txt
    拉过来,输出去

  • longlong别忘了快读快写,要宏定义的话写在最开头

常见性质

  • \(2^20 = 1048576\), 在1e6量级
  • 一棵树,C点在(A,B)路径上 当且仅当 dis(A,C) + dis(B,C) = dis(A,B)

思想方法

  • 转化成逆否命题来考虑,比如图论
  • 关于序列的部分特殊处理左右边界
  • 区间类问题注意当要利用左右端点求解时,后续有关操作枚举范围是两倍原先区间个数
  • 对于多次询问,看是不是具有单调性,根据单调性将询问离线后再处理,多可以使复杂度少一个 \(n\)
  • 若每个点入度/出度都是1,则缩完点这是一棵外/内向树,可以树形dp而非DAGdp
posted @ 2023-08-29 19:35  diamond_plus  阅读(8)  评论(0)    收藏  举报