技巧
THE___BEST
这个作者很懒,什么都没留下…
展开
-
二进制求子集
当个模板用吧#include #include #include #include #include #include using namespace std;int main(){ int n, s[50] = {0}; scanf("%d", &n); for(int i = 0; i < n; ++i) scanf("%d", &s[i]);原创 2015-09-15 17:44:38 · 1328 阅读 · 1 评论 -
KMP算法
KMP算法是一个快速的字符串匹配算法,比如要在字符串s中判断是否存在字符串t,最最简单的算法就是暴力的搜一遍,但是暴力的复杂度太高,最坏达到了O(n*m)(n是s的长度,m是t的长度)的复杂度,在n m都较大的情况下暴力算法很耗时间。而kmp算法可以大大优化复杂度,可以达到O(n+m)的复杂度。 KMP算法的核心是求出next数组,next数组就是在进行匹配某一位置的字符时如果匹配失败的话所进行的原创 2016-09-23 20:19:52 · 354 阅读 · 0 评论 -
归并排序
归并排序的思想是分治,即将大问题分解成小问题然后逐一解决,该算法先将所有数分成两个两个的很多份,然后两个两个的排序,然后将两个两个的合并成四个四个的,然后再排序,然后再合并成八个八个的再排序,那么如何将n个n(n=2,4,8,16…..)个的合并呢?原理就是例如对于四个四个的合并,由于之前两个四个数的序列是有序的,那么可以在O(n)的复杂度内将两个有序的序列合并成一个有序的序列,这就是归并排序的思想原创 2016-09-20 21:56:27 · 379 阅读 · 0 评论 -
快速乘法 Lucas定理
一个式子a*b 对于乘数b来说,可以写成二进制形式,比如1001101。由乘法分配律:a * b = a * (b1 + b2 + b3 + ……) 那么对于a * 53 = a * 110101(二进制) = a * (100000 + 10000 + 100 + 1) = a * (100000 * 1 + 10000 * 1 + 1000 * 0 + 100 * 1 + 10 * 0 +原创 2016-05-22 16:41:36 · 411 阅读 · 0 评论 -
POJ 3169(差分约束 + spfa模板)
题意:n头牛。按照编号排成一排,ml个第一种条件(u, v, w)表示编号为u的牛跟编号为v的牛的距离<=w,md个第二种条件(u, v, w)表示编号为u的牛跟编号为v的牛的距离>=w,如果这n头无法排成队伍,则输出-1,如果牛1和牛n的距离无限远,则输出-2,否则则输出牛1和牛n之间的最大距离。思路:差分约束,差分约束实际上就是求解多个不等式,比如 a - b <= 2 b - c <= 5原创 2016-07-29 12:47:26 · 366 阅读 · 0 评论 -
ZOJ 3195(LCA模板)
题意:给一个带权图 然后q个询问 每个询问有三个数x y z,求x y z这三个点连接起来需要多少距离。LCA 对于每个询问求出任意两个点对的LCA 加和 / 2。#include #include #include #include #include #include #include using namespace std;const int dx[] = {原创 2016-05-01 16:25:37 · 426 阅读 · 0 评论 -
POJ 1236(tarjan+缩点)
把所有强连通分量各缩成一个点,重新建图,ans1 = 入度为0的点的个数 ans2 = max(入度为零的点的个数,出度为0的点的个数)#include #include #include #include #include #include using namespace std;const int maxn = 100 + 7;int n, k = 0, newk = 0;原创 2016-04-14 17:53:54 · 327 阅读 · 0 评论 -
POJ3070(矩阵快速幂模板)
#include #include #include #include using namespace std;const int maxn = 3;const int mod = 10000;typedef long long LL;struct node { int a[maxn][maxn]; node() { memset(a, 0, sizeof(a));原创 2016-04-14 15:46:43 · 435 阅读 · 0 评论 -
hdu 1402 A * B Problem Plus(快速傅里叶变换模板)
快速傅里叶变换在这里的主要用处就是可以快速求出两个多项式的乘积,可以把两个大数转换成a1 + a2*x + a3*x^2......的形式,利用FFT快速求值。#include #include #include #include #include using namespace std;const int maxn = 200000 + 7;const double PI =原创 2016-04-14 13:27:12 · 420 阅读 · 0 评论 -
康拓展开
转自这位牛: 点击打开链接康托展开:X = an * (n - 1)! + an - 1 * (n - 2)! + ...+ ai * (i - 1)! + ... + a2 * 1! + a1 * 0!ai为整数,并且0 应用实例:{1, 2, 3, 4, ..., n}的排列总共有n!种,将它们从小到大排序,怎样知道其中一种排列是有序序转载 2016-02-17 12:02:25 · 577 阅读 · 0 评论 -
uva 1326
#include #include #include #include #include using namespace std;const int maxn = 25;int n;map tab;int A[maxn];char s[1024];int bitcount(int x) { return x == 0 ? 0 : bitcount(x / 2) + (x &原创 2016-01-25 21:16:42 · 488 阅读 · 0 评论 -
1121 - Subsequence
尺取法的应用#include #include #include #include #include using namespace std;const int maxn = 100000 + 7;const int INF = ~0U >> 1;int n, S, ans;int a[maxn];int main() { while(scanf("%d%d",原创 2016-01-25 13:52:48 · 256 阅读 · 0 评论 -
floyd判圈算法 (UVA 11549 - Calculator Conundrum)
floyd判圈算法的应用这个算法的主要思想是可以假设有俩小孩在同一起跑线上开始跑,第二个小孩的速度是第一个小孩的两倍,如果有环的话,则两个小孩会在某一时刻相遇,如果没有环的话则永远不会相遇例子UVA 11549 - Calculator Conundrum#include #include #include #include #include #include using原创 2016-01-24 17:45:06 · 463 阅读 · 0 评论 -
循环遍历HashMap的较快方法
package MAIN;import Book.*;import java.util.*;public class slove { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); String name; int val原创 2015-11-02 18:30:27 · 444 阅读 · 0 评论 -
AVL树(平衡二叉树)
AVL树是排序二叉树的优化版,多了个调整操作,排序二叉树在某些情况下可能会变的跟链表差不多,比如连续插入多个非递减的数: 这就会使得各种操作非常费时间,几乎和链表一样。但是AVL树避免了这一点,保证了任意一个节点的左右儿子节点的高度差不会超过1,这就使得AVL树的复杂度很平衡(插入删除查找log(n))。 这里的调整操作是基于两个旋转操作来进行的,即左旋和右旋: 右旋: 左旋(实际上原创 2016-09-29 23:33:56 · 484 阅读 · 0 评论