CSP-S初赛基础知识整理
CSP-S初赛基础知识整理
持续更新中QWQ
[1]计算机基础知识
计算机系统的组成
硬件系统和软件系统。
计算机硬件的五大组成
控制器、运算器、存储器、输入设备和输出设备。
[1-2]进制及其转化和运算
[1-2]二进制
[1]基本定义及应用
逢二进一。后缀为
是计算机主要存储方式。
[1]基本运算
- 加法 0+0=0,0+1=1,1+1=10。
- 减法 0-0=0,1-0=1,1-1=0。
- 乘法 0×0=0,0×1=0,1×0=0,1×1=1。
[2]位运算
- and(&)
0 | 1 | |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
- or(|)
0 | 1 | |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
- xor(^)
0 | 1 | |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
- not(~)
0 | 1 |
---|---|
1 | 0 |
[1]其他进制及转换
八进制
有
后缀为
2进制 | 8进制 |
---|---|
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
十六进制
有
后缀为
2进制 | 16进制 |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
十进制
有
后缀为
2进制 | 10进制 |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | 10 |
1011 | 11 |
1100 | 12 |
1101 | 13 |
1110 | 14 |
1111 | 15 |
[1]数据存储单位及其转换
-
b(it): 1bit 可以保存一个二进制位
-
B(yte):1B = 8b
-
K(B):1KB = 1024B
-
M(B):1MB = 1024KB
-
G(B): 1GB = 1024MB
-
T(B): 1TB = 1024GB
bool : 1B
char : 1B
short int : 2B
(unsigned) int : 4B
float : 4B
double : 8B
long long : 8B
(unsigned) long : 8B
long double : 16B
[1]主要人物及贡献
名字 | 国籍 | 信息学主要贡献 | 称号身份 |
---|---|---|---|
艾伦·麦席森·图灵 | 英 | 图灵机,图灵奖,图灵实验 | 计算机科学之父,人工智能之父 |
约翰·冯·诺依曼 | 美籍匈牙利 | 体系构想,程序存放于内存 | 计算机之父、博弈论之父 |
克劳德·艾尔伍德·香农 | 美 | 提出了信息熵的概念 | 信息论的创始人 |
姚期智 | 中 | 通讯复杂度,伪随机数生成 | 奠定现代密码学 |
艾达·拉芙蕾丝 | 英 | Ada语言 | 第一个程序员,计算机程序创始人 |
[5]Linux
命令 | 作用 |
---|---|
mkdir | 创建目录 |
cp | 复制文件(夹) |
rm | 删除文件(夹) |
mv | 重命名/移动 |
cd | 切换工作目录 |
pwd | 打印目录路径 |
ls | 显示目录文件 |
time | 测量运行时间 |
g++ | 编译命令 |
gdb | 调试命令 |
./a | 运行 a |
time
real time > cpu time = user time + sys time
real time
表示从程序开始到程序执行结束时所消耗的时间,包括CPU的用时。
user time
值表示程序本身,以及它所调用的库中的子例程使用的时间。
sys time
是由程序直接或间接调用的系统调用执行的时间。
gdb
默认
gdb ./a
对
gdn --args ./a 1.txt
对
其他操作
b(reak)
设置断点。
display
查看变量或式的值。
c(ontinue)
开始连续(而非单步)执行。
s(ept)
进入函数调试。
[5]编译选项
默认
g++ 1.cpp -o 1.exe
其中
额外编译指令
-x language filename
将
注意:-x
指令对其之后的所有文件都生效。
-x none filename
取消上一个指令的效果。
-c
只将文件生成为
-S
只将文件生成为汇编代码。
-o
标记输出文件。
-O0
,-O1
,-O2
,-O3
开启
-g
产生调试信息。
[5]STL
[5-8]算法
[6]复杂度分析
空间复杂度分析
时间复杂度分析
主定理
令
当
-
若
,有 ,则 。 -
若有
,则 。 -
若
,有 且对于常数 和足够大的 ,有 ,则 。
[6]基础算法
分治算法
[5-6]排序算法
排序算法 | 平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 排序方式 | 稳定性 | 评级 |
---|---|---|---|---|---|---|---|
归并排序 | 非原地排序 | 稳定 | 5 | ||||
快速排序 | 原地排序 | 不稳定 | 5 | ||||
基数排序 | 非原地排序 | 稳定 | 6 | ||||
堆排序 | 原地排序 | 不稳定 | 6 | ||||
桶排序 | 非原地排序 | 稳定 | 5 | ||||
树形选择排序(竞标赛排序) | 非原地排序 | 不稳定 | 6 |
[5]字符串
KMP
时空复杂度
时间复杂度为
基本代码
#include<bits/stdc++.h>
using namespace std;
int ans[1000039],lena,lenb;
char a[1000039],b[1000039];
int main(){
register int i,j;
cin>>a>>b;lena=strlen(a);lenb=strlen(b);
for(i=1;i<lenb;i++){
while(j&&b[i]!=b[j+1])j=ans[j];
if(b[j+1]==b[i])j++;
ans[i]=j;
}
j=0;
for(i=0;i<lena;i++){
while(j>0&&b[j+1]!=a[i])j=ans[j];
if(b[j+1]==a[i])j++;
if(j==lenb){
printf("%d\n",i-lenb+1);
j=ans[j];
}
}
for(i=1;i<=lenb;i++)printf("%d ",ans[i]);
return 0;
}
[6-8]搜索
时间复杂度基本为常数优化。
[6]减枝搜索
[6]记忆化搜索
[7]启发式搜索
[7]双向BFS搜索
[7]迭代加深搜索
[8]搜索对象压缩搜索
[6-7]图论
[6]Prim 和 kruskal 最小生成树
kruskal 时空复杂度
时间复杂度为
kruskal 基本代码
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,f[200039],tot;
struct node{int u,v,w;bool operator<(node x)const{return w<x.w;}}a[200039];
int find(int x){return f[x]=f[x]^x?find(f[x]):x;}
void kruskal(){
int x,y;
for(int i=1;i<=m;i++){
x=find(a[i].u);
y=find(a[i].v);
if(x==y) continue;
else{
ans+=a[i].w;
f[x]=y;
tot++;
if(tot==n-1) break;
}
}
}
int main(){
scanf("%d%d",&n,&m);
register int i,j;
for(i=1;i<=n;i++)f[i]=i;
for(i=1;i<=m;i++)scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
sort(a+1,a+m+1);kruskal();
if(tot==n-1)printf("%d",ans);
else printf("orz");
return 0;
}
[7]次小生成树
[6]Dijkstra、bellman_ford 和 SPFA 单源最短路
[7]单源次短路
[6]Floyd-Warshall 求最短路和传递闭包
[6]DAG拓扑排序
[6]欧拉道路和欧拉回路
[6]二分图构造和判定
[6]最近公共祖先
倍增LCA 时空复杂度
时间复杂度为预处理
空间复杂度为
倍增LCA 基本代码
#include<bits/stdc++.h>
using namespace std;
int n,m,root,x,y,d[500039];
int Fa[500039][39];
vector<int>v[500039];
void dfs(int u,int deep,int fa){
d[u]=deep;int k=1;Fa[u][0]=fa;
do{Fa[u][k]=Fa[Fa[u][k-1]][k-1];}while(Fa[u][k++]);
for(int i=0;i<v[u].size();i++)if(v[u][i]^fa)dfs(v[u][i],deep+1,u);
}
int LCA(int u,int v){
int k=19;
while(d[u]<d[v]){while(d[u]>d[Fa[v][k]]&&k)k--;v=Fa[v][k];}
if(u==v)return x;k=20;
while(k--){if(Fa[u][k]!=Fa[v][k])u=Fa[u][k],v=Fa[v][k];}
return Fa[u][0];
}
int main(){
scanf("%d%d%d",&n,&m,&root);
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(root,0,0);d[0]=-1;
while(m--){
scanf("%d%d",&x,&y);
if(d[x]>d[y])x^=y^=x^=y;
printf("%d\n",LCA(x,y));
}
}
[7]求强连通分量
[7]强连通分量缩点
[7]求割点割边
[6-8]动态规划
[6]树形动态规划
[7]状态压缩动态规划
[8]动态规划优化
斜率优化DP
四边形不等式优化DP
二维四边形不等式优化区间DP
CDQ分治优化DP
[5-7]数学知识
[5-6]高中数学
[5]代数
[6]解析几何
[6]立体几何
[5-7]初等数论
[5]同余式
[7]欧拉定理和欧拉函数
欧拉函数
当n为质数时
当n为奇数时
当
欧拉定理
当
[7]费马小定理
[7]威尔逊定理
当且仅当
[7]斐蜀定理
当
[7]逆元
当
[7]扩展欧几里得
[7]中国剩余定理
[6-7]组合数学
[6]可重集排列
对于一个有
[6]可重集组合
对于一个有
[6]错排、圆排
错排
一个长度为
递推式
通项式
圆排
从
[6]鸽巢原理
[6]二项式定理
[7]容斥原理
[7]卡特兰数
[5-7]线性代数
[5]矩阵概念
[6]特殊矩阵
稀疏矩阵
三角矩阵
[6]矩阵的初等变换
[6]矩阵的加减乘和置换
矩阵加减法
矩阵加减法满足交换律和结合律。
矩阵乘法
矩阵乘法满足结合律,不满足交换律。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!