不是很noip的知识点就不写了。

dij什么的太easy就不写了。

缩点

  • 注意\(Tarjan\)在缩边双和求强联通分量时候的区别。
  • 一个要判断是否在栈内一个不要。
  • 最后\(topsort\)来\(dp\),或者记忆化搜索,但是一定要记得初值为\(-1\)。
  • 考虑图不联通。

负环

  • 考虑图不联通。
  • 一开始\(dis=0\),判断最短路长度大于\(n\)会好一些。
  • \(dfs\)型\(spfa\)是指数级的。

ST表

  • 注意是\(i\)到\(i+2^k-1\)。
  • 所以预处理的时候不要减1,因为已经减过了。查询的时候要加1因为要把减去的1去掉。
Mx[j][i]=max(Mx[j-1][i],Mx[j-1][i+(1<<(j-1))]);
printf("%d\n",max(Mx[k][l],Mx[k][r-(1<<k)+1]));
  • \(O(n)\)预处理\(log\)。

线性基

  • 用于查询多个数异或问题,本质是高斯消元,也可以用来解方程(\(flash\)的考试题)。
  • 记得\(1ll\),线性基的值域与原数组的值域相同,且各个之间线性无关。
  • 如果要查询某个数,就是查找某个数是否可以由这\(n\)个数中任一个数异或得到。首
  • 从高到低扫这个数的每一位,如果这第\(i\)位为\(1\),就异或上\(P_i\),然后知道处理到最后一位。如果变成 \(0\) 了,那么就是可以的。
  • 查询第\(k\)大数。
  • 查询异或集合中k小值
  • 我们考虑改造一下线性基,使得每一位互相独立。
  • 如果\(j<i\),且\(p_i\)的第\(j\)位是\(1\),就把\(p_i\ xor\ p_j\)。
  • 这样,对于二进制的每一位\(i\)。只有\(p_i\)这一位是\(1\),其他的都是\(0\)。
  • 同样,这个线性基的本质也是没有改变的。
  • 我们查询的时候,将\(k\)进行二进制拆分,如果第\(i\)位是\(1\),就异或上线性基中第\(i\)个元素,最终得出的答案就是\(k\)小值。
  • 此外,需要对非满秩的矩阵进行特判。因为其存在\(0\)的结果,如果要求最小,那么就是\(0\)。
  • 如果不是,那么就是求当前矩阵下的第\((k-1)\)小。

splay 区间反转

  • 和\(lct\)一样,注意栈序下放标记
S[S[0]=1]=x;
for(R i=x;fa[i];i=fa[i])S[++S[0]]=fa[i];
while(S[0])push(S[S[0]--]);
  • 一定要记得先\(find\)到目标点再转到根而不是直接做。这里的\(find\)和整体二分是不一样的!
push(x);
if(k<=sz[ls])x=ls;
else if(k==sz[ls]+1){spl(x,gl);return x;}
else k-=(sz[ls]+1),x=rs;
  • 提醒几个常见小错误:
void rot(R x){
R y=fa[x],z=fa[y],k=son(x);
ch[z][son(y)]=x,fa[x]=z;
ch[y][k]=ch[x][k^1],fa[ch[x][k^1]]=y;
ch[x][k^1]=y,fa[y]=x;upd(y);
}
  • \(rot\)要\(upd(y)\),而不是\(upd(x)\),如果都\(upd\)要先\(y\)再\(x\),不要搞反。
  • 注意一开始要先记下来\(x\)是哪一个儿子,然后先拆开,再接起来。
for(R y=fa[x];y!=gl;rot(x),y=fa[x])
if(fa[y]!=gl)son(x)^son(y)?rot(x):rot(y);
upd(x);if(!gl)rt=x;
  • 记得判断\(y\)和\(gl\)的关系再决定转一次还是两次还是不转。
  • 一定记得更新\(x\)和\(rt\)。

splay 普通平衡树

  • 每次打这个都像在做模拟题……。
  • 两个log的树状数组把一个log的splay掉起来打
  • treap只会过两个月现在早就忘了
  • 太麻烦了,还不如树状数组或者线段树。
  • 反正你又没有区间反转。
  • 太热了不写了咕咕。

树链剖分

  • 剖分之后一般是搞个线段树对\(dfn\)序维护。
  • 树上路径就暴力跳重链条,两个\(log\)。
  • 子树信息就直接是\(dfn\)到\(dfn+sz-1\)的连续区间,一个\(log\)。
  • 如果是维护儿子信息就是\(bfs\)序 [SDOI2012]集合
  • 但是我不会啊,咕。

倍增

  • 太普及了。

左偏树

  • 可并堆,注意不能路径压缩。
  • 合并的时候根据堆的属性来判断,合并在右子树。
  • 然后强制向左偏,我的习惯是深度向左偏。
  • 记得更新\(d_i=d_{rs}+1\)。
  • 删除元素就把两个儿子并起来。

kmp

  • 核心思想是尝试匹配
  • 求\(next\)的时候是
j=f[i-1];
while(j>=0&&T[i]!=T[j+1])j=f[j];
if(T[i]==T[j+1])f[i]=j+1;
else f[i]=-1;
  • 也就是不断尝试能否接上一个新的后缀,否则就不断跳\(next\),直到为\(-1\)。
  • 查询的时候是j=f[j-1]+1;,也就是往前走一个,再调\(next\),再往后走一个,也就是\(j\)失配,\(j-1\)配对好了,那么利用\(j-1\)的\(next\),再往后走一个。

AC自动机

  • 主要思想是\(fail\)树。
  • 先建好\(trie\),然后建\(fail\),然后每次匹配的时候都把\(fail\)的信息都收集一边。

trie

  • 难道你会了\(ac\)自动机还不会\(trie\)??
  • 可持久化:和主席树差不多,序列就是相差,树上就是减去两倍\(lca\)
  • 启发式合并:和线段树启发合并差不多,也是一个\(merge\)。

最小生成树

  • 本来想补一下\(B\)算法。
  • 但是咕咕了。

dinic

  • 记得当前弧优化,边从\(2\)开始。
  • 主要技巧在建图,后面都是板子。

最小费用最大流

  • 同上。

主席树

  • 动态开点,一般和别的数据结构结合在一起。
  • 序列右边继承左边,树上儿子继承父亲。

点分治

  • 你家\(noip\)考点分治??咕咕。

manacher

  • 记录最远到达的位置和中心。
  • 然后就知道了当前点的半径下界是对称过去的半径。
  • 然后暴力更新当前半径,更新最远距离和中心。

模拟退火

  • 系统钟
db Tim(){return (db)clock()/(db)CLOCKS_PER_SEC;}
  • 生成一个于\(T\)大小相关的随机,带正负。
#define RD T*(rand()*2-RAND_MAX)
  • 接受更劣解的概率
exp((ans-now)/T)*RAND_MAX>rand())
  • 注意,\(now\)是当前答案,\(ans\)是当前\(sa\)的最优解,记得保存全局最优解\(bst\)。
  • 随机数组
random_shuffle(x+1,x+n+1);

CDQ

  • 每次强制计算跨过中点的贡献。

kdtree

  • 注意替罪羊的重构方法。

最小循环表示法

  • 今天才学。
  • 先倍长,初始时,让\(i=0\),\(j=1\),\(k=0\),其中\(i\),\(j\),\(k\)表示的是以\(i\)开头和以\(j\)开头的字符串的前k个字符相同。
  • 分为三种情况
  • 1.如果\(str[i+k]==str[j+k]\) \(k++\)。
  • 2.如果\(str[i+k] > str[j+k]\) \(i = i + k + 1\),即最小表示不可能以\(str[i->i+k]\)开头。
  • 3.如果\(str[i+k] < str[j+k]\) \(j = j + k + 1\),即最小表示不可能以\(str[j->j+k]\)开头。
  • 那么只要循环\(n\)次,就能够判断出字符串的最小表示是以哪个字符开头。
  • 为什么当\(str[i+k] > str[j+k]\),\(i=i+k+1\),最小表示不可能以\(str[i->i+k]\)开头,让我们来举个栗子。
  • 如下图,当\(i=1\),\(j=5\),\(k=3\)时,\(str[i+k] > str[j+k]\)。
  • 首先有\(S1S2S3 == S5S6S7\),\(S4 > S8\)。
  • 那么以字符\(S2\)开头肯定不如以字符\(S6\)开头更优,因为\(S4 > S8\)啊。

莫队

  • 太热了不写了。

noip级别模板小复习的更多相关文章

  1. NOIP的模板--考前复习

    距离NOIP还有25天 可以去放弃一些巨难得题目去搞一些模板了 -------在校老师的原话 一·快排 虽然可以手打,最好用STL,里面有很多优化,会快很多 #include<iostream& ...

  2. NOIP算法总结与复习

    NOIP算法总结与复习 (看了看李总的蓝皮书,收获颇多,记下此文,以明志--) (一)数论 1.最大公约数,最小公倍数 2.筛法球素数 3.mod规律公式 4.排列组合数,错排 5.Catalan数 ...

  3. 模板小程序】求小于等于N范围内的质数

    xiaoxi666 联系邮箱: xiaoxi666swap@163.com 博客园 首页 新随笔 联系 订阅 管理 [模板小程序]求小于等于N范围内的质数   1 //筛法求N以内的素数(普通法+优化 ...

  4. noip考前模板复习

    网络流 Dinic(搭配飞行员) //Serene #include<algorithm> #include<iostream> #include<cstring> ...

  5. 【模板小程序】链表排序(qsort/insert_sort/merge_sort)

    前言 本文章整理了链表排序的三种方法,分别是快速排序.插入排序.归并排序.为适应不同用途,先给出常用的int版本,再在此基础上抽象出类模板. 目录 一.针对整数的版本(常用) 文中链表定义 链表相关操 ...

  6. NOIP常见模板集合

    Preface 这篇博客记录的是我联赛前虽然只有两天了的打板子记录. 只求真的能给我起到些作用吧,一般按照难度排序. 而且从这篇博客开始我会用H3的标题代替H4 为了节约篇幅,以下的代码一般均以cla ...

  7. $Noip$前的小总结哦

    考试失误点与积累 有点不知道该干嘛了,状态有点差,写点东西.(后面可能会加更一点东西?) 常规错误 \(1.\) 数组开小 \(2.\) \(int\)和\(longlong\) \(3.\) 开某题 ...

  8. 2016年11月24日--面向对象、C#小复习

    面对对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象.对同类对象抽象出其共性,形成类.类中的大多数数据,只能用本类的方法进行处理.类通过一个简单的外部接口与外界发生关系,对象 ...

  9. angular 模板 小例子

    参考网站:https://docs.angularjs.org/tutorial/step_09 先看下目录结构 新建个空文件夹, 输入命令: express --view ejs cnpm inst ...

随机推荐

  1. 无人驾驶车辆路径跟踪的增量式PID控制

    路径跟踪是无人车研究方向的一项关键技术.路径跟踪控制算法是指能够使无人车按照预设路径,安全稳定行驶的控制方法. 建立无人车路径跟踪模型 预设无人车在A.B两点间,当前位置为D点,航向为hF 可以得到B ...

  2. 吃着火锅唱着歌学会Docker

    第一篇:Docker概述 第二篇:Docker之版本与安装 第三篇:Docker之镜像 第四篇:Docker之容器 第五篇:Dcoker之容器与镜像 第六篇:Docker之网络管理 第七篇:Docke ...

  3. Python Module_subprocess_子进程(程序调用)

    目录 目录 前言 软件环境 认识subprocess Popen Constructor构造函数 Class Popen的参数 args 调用程序 调用Shell指令 stdinstdoutstder ...

  4. Python学习之==>有依赖关系的接口开发

    一.接口需求 1.登录接口 (1)登录成功后将session信息存入redis数据库并设置失效时间为600秒 (2)构造返回结果的对象flask.make_response() (3)产生cookie ...

  5. Delphi DbgridEh实现鼠标拖动选中列,并使复选框选中

    1.先设置表格列的属性 procedure TForm_TaskToDW.InitGrid;var  MyCol: TColumnEh;begin  with DBGridEh_Task do  be ...

  6. 源特定组播(SSM:Source Specific Multicast)

    源特定组播(SSM:Source Specific Multicast)是一种区别于传统组播的新的业务模型,它使用组播组地址和组播源地址同时来标识一个组播会话,而不是向传统的组播服务那样只使用组播组地 ...

  7. pgAdmin III 使用图解

    pgAdmin III简介 要打开一个到服务的连接,在树中选择所需的服务,并双击它,或使用“工具”菜单上的连接即可. 一.主窗体 在主窗口中,显示数据库的结构.您可以创建新的对象,删除和编辑现有的对象 ...

  8. PIL实现图片框架以及生成图片验证码

    1. PIL的基本概念 PIL:即Python Imaging Library,是Python平台事实上的图像处理标准库. PIL中涉及通道(bands)和模式(mode)这两个重要概念. (1)通道 ...

  9. Kotlin-Note

    数字在需要一个可空的引用时,会进行装箱操作,数字装箱不一定保留同一性. val a = 1000 println(a === a) // 输出 "true" val boxedA ...

  10. 安装开发环境vs2017+sql2016+tfs2017

    安装开发环境vs2017+sql2016+tfs2017 编写人:左丘文 2019-7-16 近一年了,一直没空着手写点什么,跟大家交待下吧,去年一次机会,其实也不完全是去年,因此离开了我工作15年的 ...