基础
把编辑器/编译器调到舒服的状态(见考试安排)
学会用批处理和写对拍(见批处理)
学会随机化生成(见随机化)
学会离散化(这种最方便)
掌握c风格输入输出
稳固代码风格:
附个模板:
分块&莫队
分块、莫队:暴力的加强版,思维难度小,代码量小,复杂度未必最优。(适合康复第一阶段训练)
(具体题目&代码见【学习笔记】分块&莫队)
图论
存图方式:
1、邻接矩阵
2、邻接表
nume=1为了方便找反向边,=-1则head要设为-1(小于0即可)
单元最短路径
(spfa它死了)
dijkstra:要求边权都是非负数
1、稠密图(m和n^2同级别),复杂度n^2
2、稀疏图,堆优化,复杂度(m+n)logm(注意到logm和logn同级别)
3、边权较小,桶优化,时间复杂度(m+n·最大边权),空间复杂度(n·最大边权+m)
对于不同的条件,使用不同的方法找最小边权。
dijk基于贪心,只要一个点被选中标记之后,任何其他路径不会使它更优即可使用。
spfa则是使图中的每条边都满足三角形不等式(不满足则存在不合题意的环),即对于边(x,y,z),cal(dp[x],z)>dp[y],其中cal代表某种运算。
堆优化dijk
01bfs:边权为0或1的图求单源最短路
通过双端队列bfs,边权为0则从队头入队,边权为1从队尾入队。任意时刻保持队列的“两段性”和“单调性”
一个点最多入队两次,可以用vis判断(不用也是正确的)。复杂度n+m
luogu1948 [USACO08JAN]电话线Telephone Lines
二分答案后转化成01bfs
bzoj3073. [Pa2011]Journeys
线段树建图后转化成01bfs
线段树建图的步骤:(from lvzelong2014)
1、A树每个节点向父亲连边,B树每个节点向儿子连边。边权为零。
2、每个B树的叶子节点向对应的A树的叶子节点连边。
3、对于a~b连向c~d,在A树上找到a~b对应的区间u1,u2……un,将其连向虚拟节点p1,边权为0
4、虚拟节点p1到虚拟节点p2连上边权为1的边
5、在B树上找到c~d对应的区间v1,v2……vn从p2连到这些区间,边权为0
3-5的连边为(a,b)->(c,d),(c,d)->(a,b)要再连一次。
也可以将p1,p2合并成一个点,然后将3或者5中边权改为1。
点或边的数组开小了 就和线段树开小了一样常见的错误
手写队列:
1、普通队列 he=1,ta=0;q[++ta]=x;while(he<=ta){…}
2、循环队列 he=1,ta=1;q[ta++]=x;while(he!=ta){…}
luogu3008 [USACO11JAN]道路和飞机Roads and Planes
缩点+拓扑+dijk
任意两点间最短路
dijk n^3或nmlogm
floyd n^3(还可以用于解决传递闭包)
最大流
dinic
数论
线性筛
|
|
快速幂
|
|
luogu2568 GCD
所求为sum{prime}sum(2*sum(phi[i])(i=1 to n/prime)-1)