[关闭]
@orangelee-666 2020-01-17T12:48:55.000000Z 字数 4841 阅读 567

集训笔记

排序:(sort)

//通过调整原数的顺序,使数列有序。
//稳定性:两个相同元素排序后的相对位置不发生位置交换则稳定,反之不稳定
//排序范围
* 快速排序
sort(a+1, a+n+1)

基于比较

逆序对:ia[j]

不基于比较

数据结构

向量,可以理解成一个数组。

  1. push-back()//末尾插入元素
  2. pop-back()//末尾弹出元素
  3. empty()//返回是否为空
  4. size()//返回大小

链表


图论(1)

字符串:

字符组成的序列

字符串匹配

单串匹配:

一个模式串a,一个待匹配串p,找到a的字串与p相等。
暴力算法:
取a每个位置比较
设a长度n,b长度m,平均复杂度o(n)
Best O (n) worst 0(n*m)
哈希:string->int
对应关系
n+m,有一定概率出错。
* KMP克努特.莫里斯.普拉特算法:a的第i个前缀等于最长的后缀的长度。*

  1. Next [1] = 0;
  2. cpp
  3. // O (n)
  4. For (int I = 2; i<=m; i++)
  5. {
  6. Int t = next [i-1];
  7. While (t && a[t]! = a [t-1]) t = next[t];
  8. Next [i] = t+ (a[t] == a [i-1]);
  9. }

多串匹配:

一堆串a,一个串p。

AC自动机:种类:有限状态自动机:1.字符集2.状态集3.转移集


哈希值

哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上来说基本上是不可能的。
消息身份验证代码 (MAC)哈希函数通常与数字签名一起用于对数据进行签名,而消息检测代码 (MDC) 哈希函数则用于数据完整性

哈希算法

哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法


数据结构

堆 heap

线段树

树状数组

  1. while(x<=n)T[x]+=val, x+=x & -x//修改
  2. while(x) ret+=t[x], x-=x&-x//求值

跑得比线段树还快。。。

分块思想:在各种范围都很好用

图论(2)

假定所有节点的编号都是1-n,边编号1-n;
tarjan

强连通分量:极大的强连通子图。

dfn[x]//一个节点在Dfs时访问到的程序
low[x]某种最小值
tarjan主要基于dfs

  1. dfn[x]=low[x]=++index;
  2. s.push(x);
  3. instack[x]=ture;
  4. for each edge(x,y)
  5. if[!dfn(y)];
  6. {
  7. dfs(y);
  8. low(y)=min(low(x),low(y));
  9. {
  10. else if instack(y)
  11. low(x)=min(low(x),low(y));
  12. }
  13. }
  14. if [dfn(x)]==[low)(x)];
  15. {
  16. while (1)
  17. {
  18. t=s.pop(); instack(x)=false;
  19. if(t==x)break;
  20. }
  21. }
  1. dfs(u,fa);
  2. {
  3. dfn(u)=low(u)=++index;
  4. int n=ch=0
  5. dfn(v,u)
  6. low(u)=min(low[v],low[u])
  7. if(low[v]==dfn[v]) bridges.push_back(u,v);
  8. if(low[v]==dfn[u]) is_ap(u)=1;++_ch;
  9. elsse if(a!=NULL && v!=f[a])
  10. {
  11. low[u]=min(low[u]////)
  12. }
  13. }

错误程序


最短路

简单最短路:不重复的边
无负权边:不可能出现重复的边

Dijkstra算法的特点是:图上不能含有负权边、适合在稠密图上运行

最小生成树

边权最小的生成树

动态规划

状态(f的值) 转移 决策(决定) 后交叉性 搜索

递堆

递归:

多个函数互相调动

DP

search
DAG:youxiangwuhuan

背包问题

空间复杂度可以优化到O(V)。普通O(N*V)。

完全背包问题

物体有一个变为无限个。
* 详见:https://baike.so.com/doc/5989126-6202093.html

剪枝

数位DP

素数

0和1除外,只能被1和它本身整除的数叫素数

数据结构 图论

并查集 log n

RMQ

LCA

仙人掌:一棵树,可加。。。边,不相交。

排序

这是一段经典的Pascal写的快速排序代码。

虽然这个语言已经快被我们遗忘了,但是经典就是经典。

  1. procedure sort(l,r: longint);
  2. var
  3. i,j,x,y: longint;
  4. begin
  5. i:=l;
  6. j:=r;
  7. x:=a[(l+r) div 2];
  8. repeat
  9. while a[i]<x do
  10. inc(i);
  11. while x<a[j] do
  12. dec(j);
  13. if not(i>j) then
  14. begin
  15. y:=a[i];
  16. a[i]:=a[j];
  17. a[j]:=y;
  18. inc(i);
  19. j:=j-1;
  20. end;
  21. until i>j;
  22. if l<j then
  23. sort(l,j);
  24. if i<r then
  25. sort(i,r);
  26. end;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注