前言
哎呀不bb了、不bb了,马上就要比赛了
要点
1.少用STL,尽可能用数组模拟,STL会比较慢
比如“栈”,可用数组st[ ]和top模拟
2.计算空间复杂度,记住【各类型占字节数】——不要MLE,不要MLE,不要MLEqwq!
一、各类型占字节数
类型 16位 32 位 64位 char
1 1 1 char*(由寻址范围确定) 2 4 8 short int 2 2 2 int 2 4 4 unsigned int 2 4 4 float 4 4 4 double 8 8 8 long 4 4 8 long long 8 8 8 unsigned long 4 4 8 二、计算空间复杂度
首先要知道各单位转换:
8bit(位)=1Byte(字节)
1024Byte(字节)=1KB
1024KB=1MB
1024MB=1GB
一般题目会给出一个限制,例如:264MB
如果你开了一个二维数组long long a[1000][1000]
那么其所占空间大致为:8(long long 型占字节数)* 1000 * 1000 = 8000,000
这时单位是字节,要转换为MB:8000,000/1024(变成KB)/1024(变成MB) ≈ 7.63,远小于264MB,就不会爆空间啦
【注意】有些容器类储存器(自己瞎取的)如vector、queue等动态储存、删除的,计算不了所占空间,要看程序里实际运行的情况,比如最多向队列里加多少个数等,反正常常会发生【爆栈】等情况,还是要多多注意
3.复习STL的用法,有时候还是很好用的
Map的用法:https://blog.csdn.net/CQBZLYTina/article/details/80063739
Map的实际使用参考我的某篇博客:https://blog.csdn.net/qq_36294918/article/details/102767744
其他还有:queue,stack,vector,set 等
4.记住对拍模板
5.快速幂
参考博客:https://blog.csdn.net/Harington/article/details/87602682
//普通写法:
ll Quick_mod1(ll a,ll b,ll mod)
{
if(b==0)
return 1;
if(b&1)//这样判断奇偶速度更快
return a*Quick_mod1(a,b-1,mod);
else
{
int num=Quick_mod1(a,b/2,mod)%mod;
return num*num%mod;
}
}
//常用写法:
ll Quick_mod2(ll a,ll b,ll mod)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
6.逆元
【总结求逆元的多种方法】
1、当a和p互质时,逆元求解一般利用扩展欧几里得算法
2、当p为质数的时候直接使用费马小定理,p为非质数使用欧拉函数
3、当p为质数的时候,也可使用线性求[1,p-1]所有数逆元的方法
7.线段树、树状数组
【线段树】:(咕)
【树状数组】:(咕)
8.矩阵加速
以前写的博客:https://blog.csdn.net/qq_36294918/article/details/88970556
9.DP!!!(普通DP,数位DP,背包DP,计数DP... ...+滚动数组、斜率优化... ...)
10.最短路(自己一般写:dijsktra,floyd,还有...?)
11.网络流(Dinic,其他不会打...)——最小割(求最小割、割边数量、割边等的处理)
Ps.要“^1”的话,cnt从1开始!
e.g.
0^1=1
1^1=0
2^1=10^01=11=3
3^1=11^01=10=2
4^1=100^001=101=5
5^1=101^001=100=4 ... ...
12.注意时间分配(要算上打对拍的时间!)
13.文件输入输出注意不要出错,第二句不要复制粘贴,临近考试结束检查是否注释掉了
freopen("文件名.in","r",stdin);
freopen("文件名.out","w",stdout);
14.string和char
【char 的%s】遇到空格或换行停止
【string】a.读取并忽略开头所有的空白字符(如空格,换行符,制表符,进纸符)
b.读取字符直至再次遇到空白符,读取终止
15.背住【邻接表】模板!https://blog.csdn.net/qq_36294918/article/details/102694674
无向图的话,边MAXM记得开大一点(根据情况而定,e.g.有向图、无向图、树... ...),小心RE
Ps.邻接表的next[ ]要写作nxt[ ],不用time、x0、y1等会重名的变量名
16.常用的数论公式(见“寒假数论复习”和“考前总结”)
17.找找规律!(有可能是个规律题或者结论题,充分运用对拍!)
18.仔细分析样例,或许会有灵感
19.拓扑
20.并查集
21.KMP
22.哈希
学了一种比较简单的哈希:
int Hash(char s[])
{
int res=0;
for(int i=0;i<strlen(s);i++)//mod=1111151,base=131
res=(res*base+s[i])%mod;
return res;
}
上面代码中,mod决定了算出来的res的大小
常用质数:
9位:1e9+7(容易被卡?),998244353
8位:10000019
7位:1111151
23.稳中求快——把握好时间!!!
24.lower_bound和upper_bound
25.搞清楚各种位运算符
26.状态压缩的实现
27.自己带表看时间,电脑时间可能不准确
28.差分(数组普通差分、树上差分)
29.多组数据而且很多很大的话,根据情况看用memset( )还是for( )清空
emmm...反正memset( )不要用多了...
30.记得开long long 啊,开long long
31.数组大小要开够,不要RE啊,不要RE
32.多组数据,输出记得换行
33.离散化
34.欧拉回路、欧拉通路
(一)首先我们要知道无向图关于欧拉路的知识:
定理
无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度结点(度数为奇数的顶点)或者无奇度结点。
推论
(1) 当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点;
(2)当G是无奇度结点的连通图时,G必有欧拉回路
(3)G为欧拉图(存在欧拉回路)的充分必要条件是 G为无奇度结点的连通图
(二)选择起点
由于本题是无向连通图且保证有解,于是只有两种情况:
1.图为欧拉图(存在欧拉回路):无奇点
2.图为半欧拉图(存在欧拉通路):有奇点
所以只用从小到大检查是否有奇点,如果有就从该点开始,没有就从1开始(保证字典序最小)
(三)如何找欧拉 回/通 路
DFS搜索
利用欧拉定理判断出一个图存在欧拉通路或欧拉回路后,选择一个正确的起始顶点,用DFS算法遍历所有的边(每条边只遍历一次),遇到走不通就回退。
在搜索前进方向上将遍历过的边按顺序记录下来。这组边的排列就组成了一条欧拉通路或回路
35.去除String字符串最末尾字符的方法:
s.erase(s.end()-1);
s.end( )指向的是字符串末尾+1的位置
36.二分(最大值最小/最小值最大,单增/单减)
37.c++中自带三角函数(不知道靠不靠谱...)
具体使用方法参考我的某篇博客:https://blog.csdn.net/qq_36294918/article/details/102782270
C++中sin、cos、tan、asin、acos、atan等三角函数的计算是弧度,而不是角度
如果想对角度进行这些三角函数运算,需要乘以(PI/180)把角度转为弧度
答案要求角度的话,就把弧度乘以(180/PI)转为角度
头文件include<math.h>
常用函数:
abs绝对值函数acos反余弦函数,asin反正弦函数,atan反正切函数
exp e的x次方
cos余弦函数,sin正弦函数,tan正切函数
ceil求不小于x的最小整数
log,e为底对数,log10,10为底对数
sqrt,开方
38.关于进制转换
十进制——>其他进制:
其他进制——>十进制:
40.关于“高精浮点数double”
输入:%l f
输出:% f
41.二分图匹配
42.高精度+压位
43.单调栈\单调队列
44.扩栈语句
点击工作栏中的【工具】选项
再点击【编译器选项】
在【编译时加入以下命令】中输入以下语句:
版本一:
-std=c++11 -Wall -Wl,--stack=268435456
版本二:
-std=c++11 -Wall -Wl,--stack=100000000
//好吧我承认没有什么区别,只是说明扩栈一般开多大...
45.更多编译信息
我用的Dev~
在学校的
辣鸡XP电脑上写的,所以看上去可能会很“古老”orz...
有两种方法【获取更多编译信息】
1.手动输入语句
2.编译器中设置
【手动输入语句版】(我一般记不住语句orz)
点击工作栏中的【工具】选项
再点击【编译器选项】
在【编译时加入以下命令】中输入语句:
-std=c++11 -Wall
最后点击确定即可
【编译器中设置版】
如果记不住输入语句(毕竟有空格和符号什么的),就可以学习下面这个优秀的方法,个人觉得很方便~
点击工作栏中的【工具】选项
再点击【编译器选项】
找到【代码生成/优化】下的【代码警告】,将【显示最多/较多警告信息】选为【Yes】
这样就能帮助你发现更多代码问题啦
一般的编译,下面的代码是不会出现警告的
输入了编译语句或开启【显示最多警告后】就会提醒你没有加取地址符“&”