在此对学长们表示深深的敬意……
记忆化搜索 or 递推
线段树/树状数组
记忆化搜索
背包九讲
tyvj 1005
其实简单来说,方程就是:
tyvj 1008 / 1015 / 1124 / 1034
POJ 1191 (这题好乱啊啊啊啊啊……)
tyvj 1055 沙子合并
noip 2006 能量项链
tyvj 1052 / 1051
POJ 1038 Bugs公司
POJ 2374
bzoj 1010
bzoj 1791 / 2878
bzoj 1023
2010.T2 乌龟棋
2010.T4 引水入城
2011.T2 选择客栈
2012.T3 开车旅行
2013.T3 货车运输
2013.T5 花匠
2013.T3 飞扬的小鸟(完全背包)
2015.T2 子串
如:快速排序、归并排序。
都好都坏扔一个,否则全扔
N为偶数
i,j,k 所以 2∗i+k>2∗j+k
奇数
2∗i+k+1>2∗j+k
a=b 或 分成两个长度相等的子串,分别判断
如:abcd 等价于 bacd
这个用 n2 递归会炸时间的……
判断a和b的最小表示是否相同(共有元素)(nlogn)
个位,十位
把数字插入到第一个比它大的数前(可以二分出位置)
在数列中选择最小的顺序排放
前一个大就交换
随机选一个基准值,前排后排(分治思想)
输出堆顶并删除
最实用
先将原数列分成两部分(经典分治思想),再用指针挑小的拿出来
归并
第二组与第一组能成逆序对的数量是先于第一组出来的第一组后面元素个数的总和
冒泡
每交换一次相邻的a[i],a[i+1]就减少恰好一个逆序对,所以交换次数=逆序对数
sort(起点,终点,比较函数);
快速排序,不稳定
priority_queue<int> q;
q.push(); q.pop(); q.top();
优先队列
左<右
-合并果子≈Noi 2015 荷马史诗
-POJ 1456_sol.2
-POJ 2442
归并思想(nmlognm)__可用三元组
数学归纳法(nmlogn)
-最大异或值
-POJ 2001 求最短非公共前缀
-POJ 3630 判断字符串是否为另一字符串前缀
-BZOJ 2251 输出出现次数大于1的01串的子串
-POJ 3764 这个太难了……
-POJ 2182
-POJ 2828
-tyvj 1432
建树 修改 查询 延迟标记 扫描线
-POJ 3468
-tyvj 1038 ST
-tyvj 1039 segment tree
-SPOJ GSS1/GSS3
-POJ 1151
-POJ 1177 求矩形面积∪ 周长∪
-POJ 2482
单旋转、双旋转
treap & splay
快速判断两字符串是否相同
也可在状态空间大时使用
起始位置开始的为前缀(hash[i]),后缀同理
hash[i] = (hash[i-1]*k+str[i])%p
(k >= 字符集,取31.131.13131冲突小 ; p取较大的质数,防卡多取
如:98765=(((9*10+8)*10+7)*10+6)*10+5
i~j 的hash值: [hash[j]-hash[i-1]*k^(j-i+1)]%p
最长公共前缀:二分
选取既是前缀又是后缀的最长子串
-兔子的DNA(裸题)
-字符串的排序
用 后缀排序, 称为后缀数组
-最长回文子串
从某一位置向两边查询(二分 + 哈希)
二分是一个非常重要的思想
strlen(长度) strcpy(复制) strcat(拼接) strcmp(比较) sscanf / sprintf (从字符串中读取 输出)
-判断两多边形是否全等
边权和角分别表示存成字符串
1.最小表示(O(n)) 2.KMP(O(n))
求T在S中出现的位置
1. 朴素思想:暴力枚举(n*m)
2. next:用T匹配T自己(错一位比较,即next[1]=0,j=0)
求next数组的 代码如下:
next[1]=0;
j=0;
for(int i = 2; i <= m; i++){
while(j && b[j+1] != b[i]) j = next[i];
if(b[j+1] == b[i]) j++;
next[i] = j;
}
-POJ 3461
-POJ 2406
-POJ 2752
-POJ 1635 Subway Tree Systems (判断两棵树是否同构)
最小表示法适合所有同构比较
i = 0; j = 1; i, j一次向后进行比较
环的处理方法:先复制一倍
return b==0 ? a : gcd(b, a%b);
另:既约剩余系, 费马小定理, 欧拉函数 , 乘法逆元, 数论倒数 , 中国剩余定理 , 概率与期望……
扩展欧几里德算法与数论倒数
-全排列
-N皇后
-自然数拆分
-数独 POJ 2676 3074 3076
-武士风度的牛
-补丁 VS 错误
-POJ 3322
适用于 组合优化问题
例一:雷达
问题转化:见下图
例二:搬书
摆书的方法:竖着摆!!!他就不能好好放书嘛!!!
读得越早位置越靠上
例三:牛吃花问题(吃得多的送得早,简称"作")
我宁可去做牛吃草……
比较TxDy与TyDx的大小判断xy哪个先被送走
例四:叠奶牛问题
搬书还是更人性……压在奶牛上的最后一棵花
方法≈例三,判断两头奶牛交换前后风险值变化
下面是一堆杂题
1. 求n个点的无向简单连通图的个数(计数问题)
可求补集,即无向简单不连通图
f(n) = 2^[m(m-1)/2]-he(i=1…n-1)f(i)2^[(n-i)(n-i-1)/2]C(n-1…i-1)
2. 求无序对数 题略
k=3 时 ans = [nixuduishu(a,b)+ni(a,c)+ni(b,c)]/2
邻接矩阵 dis[i][j]=1
邻接表 用链表
深度优先搜索(用栈 递归实现)
广度优先搜索(用队列)
-POJ 1125 (最短路)
-判断二分图(染色)
-DAG的拓扑排序(删除入度为0的点,邻接表) //砸摄像头问题
-POJ 2367
-路径权值定义为边的权值和+点的权值最小值,求最短路
-热浪
-POJ 3259 判负权环
-POJ 3463 / 3635 / 2200 (次短路)
-POJ 1025 / 2330 (差分约束模型)
-POJ 1734
-POJ 1679 / 1639 (最小生成树)
-NOIP 2013 货车运输 (LCA)
-POJ 2976 Dropping tests(01分数规划)
朱刘算法 求解最小树形图