【2019-总结】考试注意事项与要点总结——持续更新中...

前言

哎呀不bb了、不bb了,马上就要比赛了

要点

1.少用STL,尽可能用数组模拟,STL会比较慢

比如“栈”,可用数组st[  ]和top模拟

2.计算空间复杂度,记住【各类型占字节数】——不要MLE,不要MLE,不要MLEqwq!

一、各类型占字节数

类型16位32 位64位

char

111
char*(由寻址范围确定)248
short int222
int244
unsigned int244
float444
double888
long448
long long888
unsigned long448

二、计算空间复杂度

首先要知道各单位转换:

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】

这样就能帮助你发现更多代码问题啦


一般的编译,下面的代码是不会出现警告的

输入了编译语句或开启【显示最多警告后】就会提醒你没有加取地址符“&”

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值