做题经验
语法类
-
\(\color{red}{!!!!!!!!!!!!!}\)开ll时,左移右移等位运算,注意要写
1ll** -
最好是只要有常数就加上
ll; -
数学题精度开高!!能用
long double就用,log改logl,ceil改ceill. -
形如:
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))是安全的
- 题目数据范围在int内,循环赋成
-
赋值运算符先运行右边,注意顺序,例如
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的位运算加括号
-
multiset的erase是删除所有与给定值相等的数 -
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

浙公网安备 33010602011771号