NOIP 提高组各种复习
一、初赛
NOI系列比赛支持语言
根据国际信息学奥林匹克竞赛(IOI)的相关决议并考虑到我国目前程序设计语言的具体情况,CCF决定:
1.2020年开始,除NOIP以外的NOI系列其他赛事(包括冬令营、CTSC、APIO、NOI)将不再支持Pascal语言和C语言;
2.从2022年开始,NOIP竞赛也将不再支持Pascal语言。即从NOIP2022开始,NOI系列的所有赛事将全部取消Pascal语言;
在无新增程序设计语言的情况下,NOI系列赛事自NOIP2022开始将仅支持C++语言。
二进制相关
1.二进制数的表示:
- 有符号整数:\(n\)位2进制数中,第一位为符号位,0为正,1为负,后面\(n-1\)位表示数值,表示范围为\(-2^{n-1}\) ~ \(2^{n-1}-1\)
- 无符号整数:没有符号位,表示范围为\(0\) ~ \(2^n-1\)
2.源码、反码、补码:
以下默认均为二进制数
- 正数:
- 源码:数的二进制表示(有符号)
- 反码:与源码相同
- 补码:与源码相同
- 负数:
- 源码:数的二进制表示(有符号)
- 反码:源码除符号位外每位逐一取反
- 补码:反码最后一位加一
- 0:在计算机中,0的符号位为0,算入正数中
3.c++中各种类型的表示范围:
int: \(-2^{31}\) ~ \(2^{31}-1\)
unsigned int:\(0\) ~ \(2^{32}-1\)
long long :\(-2^{63}\) ~ \(2^{63}-1\)
unsigned long long : \(0\) ~ \(2^{64}-1\)
4.常用位运算
左移 << 和 右移>>:
左移\(i\)位就是在原二进制数末尾添加\(i\)个0,右移\(i\)位就去掉原二进制数末尾\(i\)位
左移一位相当于乘2,右移一位相当于除以2
e.g.\((11100)_2\)<<\(3=(11100000)_2\) \((11100)\)>>\(3=(11)_2\)
\(x\)<<\(i\)=\(x^i\) \(x\)>>\(i\)=\(x\div2^i\)
(p.s.下面列举的几种位运算的名称和符号顺序为中文名、英文名、计算机符号、数学符号)
按位与 and & \(\wedge\):
当两个二进制数相同位上均为1时结果的这一位取1,否则取0
e.g.\((11100)_2\) & \((00101)_2 = (00100)_2\)
通常用于二进制取位操作:二进制数\(x\)的第\(i\)位为\(x\)&\((1\)<<\(i)\)
按位或 or | \(\vee\):
当两个二进制数相同位上有至少1个1时结果的这一位取1,否则取0
e.g.\((11100)_2\) | \((00101)_2=(11101)_2\)
通常用于将二进制数特定位上强制置1:将二进制数\(x\)的第\(i\)位置为1,结果为\(x\)|\((1\)<<\(i)\)
按位异或 xor ^ \(\oplus\):
当两个二进制数相同位上数字不同是结果的这一位取1,否则取0
e.g.\((11100)_2\)^\((00101)_2=(11001)_2\)
所以可知两次异或同一个数后结果不变,即\(a\)^\(b\)^\(b=a\)
通常用于将二进制数特定位上取反:将二进制数\(x\)第\(i\)位取反结果为\(x\)^\((1\)<<\(i)\)
将二进制数\(x\)第\(i\)~\(j\)位取反结果为\(x\)^\((((1\)<<\((j-i+1))-1)\)<<\(j)\)
按位取反 not ~ :
将二进制数逐位取反,0变1,1变0
e.g.~\((11100)_2=(00011)_2\)
计算机内存单位及换算
1 B = 8b (b = bit 比特, B = Byte 字节)
1 KB = 1024 B
1 MB = 1024 KB = 1048576 B
1 GB = 1024 MB
1 TB = 1024 GB
1 PB = 1024 TB
各种排序及其时间复杂度、空间复杂度和稳定性
稳定性:能否保证满足同样大小的数排序后按照原来的位置关系。如从小到大排序时,所有满足\(a_i<a_j\)且\(i<j\)的两个数排序后仍满足\(a_i\)在\(a_j\)前面
排序方法 时间复杂度 空间复杂度 稳定性 快速排序 一般\(O(n log n)\),最坏情况下\(O(n^2)\) \(O(logn)\) 不稳定 shell 排序(希尔排序) \(O(n^2)\) \(O(1)\) 不稳定 堆排序 \(O(nlogn)\) \(O(1)\)(直接在原序列上建立堆) 不稳定 选择排序 \(O(n^2)\) \(O(n)\) 不稳定 归并排序 \(O(nlogn)\) \(O(n)\) 稳定 基数排序 \(O(n)\) \(O(n)\) 稳定 插入排序 \(O(n^2)\) \(O(n)\) 稳定 冒泡排序 \(O(n^2)\) \(O(1)\) 稳定 编程思想:
面向过程:是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。
面向过程的编程语言有:C, Fortan, Pascal,汇编语言
面向对象:是一种以事物为中心的编程思想。
比如以公共汽车而言。“面向过程”就是汽车启动是一个事件,汽车到站是另一个事件。在编程序的时候我们关心的是某一个事件。而不是汽车本身。我们分别对启动和到站编写程序。类似的还有修理等等。
面向对象的编程语言有:C++, Java, Python
计算机方面的奖项:图灵奖,CCF 王选奖
各种学会、比赛的简称及其对应全称:
- 中国计算机学会 CCF
- 全国青少年信息学奥林匹克联赛 NOIP
- 全国青少年信息学奥林匹克竞赛 NOI
图片格式:gif, jpeg, png
视频格式:mp4, avi, wmv, rmvb, mkv 等等
音频格式:mp3, ape
哈夫曼(Huffman)算法相关:
- 哈夫曼算法采取的是贪心的思想
- 哈弗慢树中叶子节点个数比非叶子节点个数多1
二、复赛
卡特兰数:
简单介绍:
第\(n\)个卡特兰数 \(C(n)=C(0)\times C(n-1)+C(1)\times C(n-2)+\cdots+C(n-1)\times C(0)\)
它的通项公式为 \(C(n)=C^n_{2n}-C^{n+1}_{2n}=\frac{C^{2n}_n}{n+1}\)(证明)
应用:
有\(n\)个节点的二叉树的形态有\(C(n)\)种
\(n\)个数出栈入栈的顺序有\(C(n)\)
\(n\)对括号的匹配方式有\(C(n)\)种
凸\(n\)边型切割成若干个小三角形共有\(C(n)\)种
将一个含有\(n\)个数的乘法式子括号化,使其最后表示为两个东西相乘的形式(e.g.\((1\times2)\times(3\times4)\)和\((1)\times((2\times3)\times4)\)都是将\(1\times2\times3\times4\)括号化的结果之一),有\(C(n)\)种括号化的方式
\(\cdots\)
常见博弈
Bash Game 巴什博弈
有一堆石子共有\(n\)个。A B两人轮流取,A为先手。每次最少取1颗,最多取\(k\)颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出\(n\)和\(k\),求先手是否有必胜策略。
结论:当\(n\%(k+1)==0\)时先手必败,否则先手必胜
证明:\(n\)可以表示为\(n=x(k+1)+y\)
\(1^\circ\) \(y=0\)
若先手取\(a\)颗,则后手取\(k+1-a\)颗
此种情况下后手必胜,先手必败
\(2^\circ\) \(y\neq 0\)
先手第一轮先取走\(y\)颗
以后后手取\(b\)颗,先手在下一轮取\(k+1-b\)颗
此时先手必胜,后手必败
综上,当\(n\%(k+1)==0\)时先手必败,否则先手必胜
Nim Game 尼姆博弈
有\(n\)堆石子,每堆分别有\(a_1,a_2,a_3,\dots,a_n\)个,两个人轮流从某一堆取任意多石子,每次至少取一个,可以取完,最后取光者胜。问先手是否有必胜策略。
结论:当\(a_1\)^\(a_2\)^\(a_3\)^\(\cdots\)^\(a_n=0\)时,先手必胜,否则必败
证明: 首先,对于这个博弈,有以下几个性质存在:
(1) 无论如何取都取成必胜状态的状态为必败状态
(2) 无论如何取都取成必败状态的状态为必胜状态
(3) 最终无法取石子的状态为必败状态
所以,要证明这个博弈的结论,只需要证明下面这三个东西对于这个结论成立:
\(1^\circ\) 最终的状态为必败状态
最终状态全部石子堆中都为0个石子,异或后结果为0,成立
\(2^\circ\) 必败状态一定能通过取一次石子变为必胜状态
不妨设有一个状态\((a_1,a_2,a_3,\dots,a_n)\)满足\(a_1\)^\(a_2\)^\(a_3\)^\(\cdots\)^\(a_n=k\)
则一定存在一个\(a_i\)\('\)可以替换\(a_i\)使得\(a_1\)^\(a_2\)^\(a_3\)^\(\cdots\)^\(a_i\)\('\)^\(\cdots\)^\(a_n=0\)
那么此时\(a_i\)\('\)的二进制最高位与\(k\)的二进制最高位相同
又因为\(a_i\)^\(k<a_i\)一定成立 所以替换\(a_i\)的\(a_i\)\('=a_i\)^\(k\)
此时\(a_1\)^\(a_2\)^\(a_3\)^\(\cdots\)^\(a_i\)\('\)^\(\cdots\)^\(a_n=0\)
所以此时取的石子数量为\(a_i-a_i\)\('\)
\(3^\circ\) 必胜状态通过取一次石子不能变为必胜状态
即 若状态(\(a_1,a_2,a_3,\dots,a_n\))满足\(a_1\)^\(a_2\)^\(a_3\)^\(\cdots\)^\(a_n=0\),则一定不存在一种合法的移动将\(a_i\)改为\(a_i\)\('\)后同样满足\(a_1\)^\(a_2\)^\(a_3\)^\(\cdots\)^\(a_i\)\('\)^\(\cdots\)^\(a_n=0\)
因为此时\(a_1\)^\(a_2\)^\(a_3\)^\(\cdots\)^\(a_n=\)\(a_1\)^\(a_2\)^\(a_3\)^\(\cdots\)^\(a_i\)\('\)^\(\cdots\)^\(a_n\)
所以\(a_i=a_i\)\('\)
即没有取任何石子,不满足要求,所以\(3^\circ\)成立
相关题目:poj1704
Wythoff Game 威佐夫博弈
有两堆各有\(a,b\)个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。问先手是否有必胜策略。
结论:不妨设\(a<b\).令\(k=b-a\),当\(a,b\)满足\(a=\lfloor\frac{k(1+\sqrt{5})}{2}\rfloor\),\(b=a+k\)时,先手必败,否则先手必胜
平面几何
矩形相交面积
例题:[hdu2056]有两个矩形,给定两个矩形对角线上的两个端点坐标,求两矩形相交部分面积
假定已知的端点都是左上角和右下角(输入给的是对角线上的端点,可能是左上角和右下角,也可能是左下角和右上角,可以互相转化)
\(1^\circ\)两矩形不相交
此时位于上方的矩形的最小纵轴坐标大于位于下方的矩形的最大纵轴坐标,位于左方的矩形的最大横轴坐标小于位于右方的矩形的最小横轴坐标
特判这种情况,输出\(0.00\)(注意题目要求,要保留两位小数)
\(2^\circ\)两矩形相交
显然两矩形相交部分一定也是一个矩形
相交形成的这个矩形:左上角坐标:横轴:原来两个矩形左上角坐标中横轴坐标较大的那个
纵轴:原来两个矩形左上角坐标中纵轴坐标较小的那个
右下角坐标:横轴:原来两个矩形右下角坐标中横轴坐标较小的那个
纵轴:原来两个矩形右下角坐标中纵轴坐标较大的那个
设求得的相交形成的矩形的左上角坐标为\((x_1,y_1)\),右下角坐标为\((x_2,y_2)\)
则相交部分的面积\(S=(x_2-x_1)\times(y_2-y_1)\)
总结:注意细节:题目给定的对角线没有说是主对角线还是副对角线,需要转换;特判不相交时输出\(0.00\)要保留两位小数
向量
这里不赘述,只是简单讲一下,有兴趣可以百度深究向量
一些定义:1)标量:只有大小,没有方向的量(如长度、面积等)
2)向量:既有大小,也有方向的量(如力,速度等)
3)以\(A\)为起点,\(B\)为终点的向量记作\(\vec{AB}\);向量可以用单个小写字母表示如\(\vec{a}\)
4)可以将起点为原点,终点为\((x,y)\)的向量\(\vec{a}\)记作\(\vec{a}=(x,y)\)
4)向量的长度(也称作模)记作\(|\vec{AB}|\)
5)零向量:长度为\(0\)的向量
单位向量:长度为\(1\)个单位的向量
6)平行向量、共线向量:方向相同或相反的非零向量
相等向量:长度相等且方向相同的向量
相反向量:与\(\vec{a}\)长度相等、方向相反的向量称作\(\vec{a}\)的相反向量
基本运算:假设有两个向量\(\vec{a}=(x_1,y_1)\),\(\vec{b}=(x_2,y_2)\)
1)加法:\(\vec{a}+\vec{b}=(x_1+x_2,y_1+y_2)\)
2)减法:\(\vec{a}-\vec{b}=(x_1-x_2,y_1-y_2)\)
3)乘法:向量乘法分两种,分别是内积和外积
内积的结果是一个实数,外积的结果是一个向量
内积: