模板
霜刃未曾试
这个作者很懒,什么都没留下…
展开
-
欧几里得与扩展欧几里得
欧几里得:int gcd(int a, int b){ return !b ? a : gcd(b, a%b);}int lcm(int a, int b)//最小公倍数{ return a / gcd(a, b) * b;//先除后乘避免溢出}扩展欧几里得:存在整数对(x,y)(x,y)使得ax+by=gcd(a,b)ax+by=gcd(a,b) 推导过程: 用递归求原创 2017-10-10 14:23:43 · 345 阅读 · 0 评论 -
分块模板
//有n个数,两种操作:M L R W:对[L,R]内元素都加上W;A L R C:求[L,R]内元素大于等于C的个数const int N = 1e6 + 10;int n, m;int block, sz;int pos[N], L[N], R[N], add[N];//add数组相当于lazy标记int a[N], b[N];void reset(int x){ for(i原创 2017-09-28 13:53:54 · 428 阅读 · 0 评论 -
线段树模板
线段树区间更新://0 x y v: [x,y]内元素都加上v//1 x y: [x,y]内元素的和typedef long long ll;const int N = 100010;struct node{ int l, r; ll val, mark;}tr[N*4];int cas = 0;void push_up(int k){ tr[k].val原创 2017-08-31 20:58:52 · 290 阅读 · 0 评论 -
bitset总结
bitset<n> b //尖括号内是长度,默认构造函数全部初始化为0下标从0开始,因此下标是从0到n-1。以0位开始的位串是低阶位,以n-1位结束的位串是高阶位bitset<n> b; //b有n位,每位都为0bitset<n> b(u); //b是unsigned long型u的一个副本,不足补0bitset<n> b(s); //b是string对象s中含有的位串的副本,不足补0,注意从原创 2017-09-03 10:42:38 · 409 阅读 · 0 评论 -
伸展树模板
给定一个数n,代表有一个数列1~n,有下面两种操作: CUT a b c 把区间[a,b]这一段元素切下来接到第c个元素的后面 FLIP a b 反转区间[a,b]//其中有一些与本题无关的代码#define key_val son[son[root][1]][0] //splay操作序列时经常用到的一个值typedef long long ll;const int N = 300010原创 2017-09-05 21:50:29 · 460 阅读 · 2 评论 -
rope总结
#include <ext/rope> //所在头文件using namespace __gnu_cxx;//所在命名空间const int N = 10000 + 10;//一般用来处理字符串rope<char> rs;//可以是int之类的类型,但是会有某些方法无法使用//等价于crope rsrs.insert(pos, str);//从pos位置开始插入strrs.erase(po原创 2017-09-26 15:20:39 · 1933 阅读 · 0 评论 -
树状数组模板
树状数组://模板是求数组中的逆序对数typedef long long ll;const int N = 500000 + 10;int a[N], b[N];struct Bit //封装成结构体更好看些。{ int n, b[N]; void init(int _n) { n = _n; memset(b, 0, sizeof原创 2017-08-31 20:25:37 · 337 阅读 · 0 评论 -
kmp算法模板
kmp算法://求解原串中包含多少模式串,模式串可以互相覆盖,不能覆盖的稍微修改一下即可char ori[N*100], pat[N];//ori为原串,pat为模式串int Next[N];//两个get_next函数,任选其一//void get_next(char *pat)//{// int i = 0, j = -1;// Next[0] = -1;//原创 2017-08-29 10:40:50 · 418 阅读 · 0 评论 -
块状链表模板
块状链表://下标从0开始//块大小和块数设为比sqrt(n)稍大const int N = 2000000 + 10, block_sz = 4000 + 100, block_num = 4000 + 10;queue<int> que;int head;char str[N];struct block{ int sz, next;//sz:块内大小,next:下一个块位置原创 2017-08-28 12:41:48 · 596 阅读 · 0 评论 -
树链剖分模板
stoer-wagner算法://稠密图用此模板,此模板点下标从0开始const int N = 510, INF = 0x3f3f3f3f; int mpa[N][N], dis[N], v[N];//v数组是马甲数组,dis数组用来表示该点与A集合中所有点之间的边的长度之和 bool vis[N];//用来标记是否该点加入了A集合 int stoer_wagner(in原创 2017-08-27 10:19:36 · 250 阅读 · 0 评论 -
hash模板
一维hash//求原串中有多少个模式串//Seed[i]是seed的i次幂//hash[j]-hash[i-1] * Seed[len]是区间[i,j]的hash值,len是区间长度typedef long long ll;typedef unsigned long long ull;const int N = 1000000 + 10, M = 10000 + 10, INF = 0x3原创 2017-09-28 14:38:57 · 754 阅读 · 0 评论 -
可持久化并查集
//n个集合 m个操作 //1 a b 合并a,b所在集合 //2 k 回到第k次操作之后的状态(查询算作操作) //3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 //所给的a,b,k均经过加密,加密方法为x = x xor lastans,lastans是上一次的输出答案//并查集实质是一个数组,可持久化并查集就是一个可持久化数组,可以用可持久化线段树维护,本质就是这样原创 2017-09-28 15:03:26 · 438 阅读 · 0 评论 -
逆元模板
扩展欧几里得求逆元:int extgcd(int a, int b, int &x, int &y){ int d = a; if(b != 0) { d = extgcd(b, a%b, y, x); y -= (a / b) * x; } else x = 1, y = 0; return d;}int mod原创 2017-10-10 15:43:02 · 626 阅读 · 0 评论 -
ACM模板
图论: 最短路相关模板 最小生成树模板 网络流模板 二分图匹配模板 强连通分量模板 全局最小割模板 最小树形图模板数据结构: 字典树模板 并查集模板 RMQ(ST)模板 LCA模板 树链剖分模板 块状链表模板 树状数组模板 线段树模板 伸展树模板 treap模板 可持久化并查集 可持久化t原创 2017-08-26 18:38:41 · 759 阅读 · 1 评论 -
可持久化线段树模板
区间第k小:const int N = 100000 + 10, INF = 0x3f3f3f3f;int lson[N*20], rson[N*20], sum[N*20];int root[N];int tot;int a[N], b[N];void build(int l, int r, int &x){ x = ++tot; sum[x] = 0; if(l原创 2017-09-01 19:06:06 · 433 阅读 · 0 评论 -
可持久化字典树
普通模板://给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R)。求A[L] 至 A[R] 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值是多少? const int N = 50000 + 10;int son[N*35][2], sum[N*35];int root[N];int tot;int len = 31原创 2017-10-18 10:26:29 · 860 阅读 · 0 评论 -
莫队算法
普通莫队算法://求线性区间内不同元素的个数const int N = 30010;struct node{ int l, r, id;}q[N*10];int n, m, block, tmp;int ans[N*10], num[N];int a[N], b[N];bool cmp(node a, node b){ return a.l/block != b.l原创 2017-09-28 12:55:21 · 393 阅读 · 0 评论 -
扩展kmp
给出两个字符串s1,s2,求出s2的每一个后缀在s1中出现的次数乘以这个后缀的长度,并累加求和,输出这个和//next[i]表示pat与pat[i,len-1]的最长公共前缀//extend[i]表示pat与ori[i,len-1]的最长公共前缀typedef long long ll;const int N = 1000000 + 10, mod = 1e9 + 7;char ori[N]原创 2017-10-17 20:56:27 · 525 阅读 · 0 评论 -
treap模板
旋转版treap://1. 插入x数//2. 删除x数(若有多个相同的数,因只删除一个)//3. 查询x数的排名(若有多个相同的数,因输出最小的排名)//4. 查询排名为x的数//5. 求x的前驱(前驱定义为小于x,且最大的数)//6. 求x的后继(后继定义为大于x,且最小的数)const int N = 100000 + 10, INF = 2e9 + 10;struct node{原创 2017-09-28 12:42:18 · 432 阅读 · 0 评论 -
最近公共祖先模板
倍增法://模板是有向图,故需要找树根,无向图不需要#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int N = 10010;const int INF = 0x3f3f3f3f;struct edg原创 2017-08-27 12:30:20 · 355 阅读 · 0 评论 -
暂存
约瑟夫环#include <bits/stdc++.h>using namespace std;const int N = 1000 + 10;int main(){ int n, k; scanf("%d%d", &n, &k); int ans = 0; for(int i = 2; i <= n; i++) ans = (ans + k) % i;原创 2017-10-08 15:18:03 · 304 阅读 · 0 评论 -
一些大数模板
//计算两个大整数的和,要求非负整数void add(char *s, char *s1, char *s2){//s储存结果,s1、s2是两个加数 int len1 = strlen(s1), len2 = strlen(s2); reverse(s1, s1 + len1); reverse(s2, s2 + len2); int t = 0; for原创 2017-10-07 15:05:16 · 330 阅读 · 0 评论 -
全局最小割模板
stoer-wagner算法://点下标从0开始const int N = 510, INF = 0x3f3f3f3f; int mpa[N][N], dis[N], v[N];//v数组是马甲数组,dis数组用来表示该点与A集合中所有点之间的边的长度之和 bool vis[N];//用来标记是否该点加入了A集合 int stoer_wagner(int n) {原创 2017-08-28 09:01:20 · 336 阅读 · 0 评论 -
最短路相关模板
spfa:spfa://适合稀疏图const int N = 1010, INF = 0x3f3f3f3f; //N是点数struct edge{ int to, cost, next;}g[N*N*2];int cnt, head[N];int dis[N];bool vis[N];void init() //初始化{ cnt = 0; memset(he原创 2017-08-26 18:37:04 · 333 阅读 · 0 评论 -
最小树形图
朱刘算法:给定n个点和m条有向边,边有权值,选择一个点,从这个点可以到达其他所有点且权值最小,若这样的点有多个,选择编号最小的那一个 不定根最小树形图,因为没有给定根,所以虚拟一个根,从虚拟根向所有点连虚拟边,权值设为一个可以和其他边区分的数字,设比其他所有边权值和大1。然后求最小树形图,如果求出的最小树形图中含有2条及以上的虚拟边,则原图肯定没有最小树形图。至于最小树形图存在时如何求编号最小的点原创 2017-08-27 10:57:56 · 832 阅读 · 0 评论 -
HDU 3068 最长回文 manacher算法模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3068题意:Problem Description给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input输入有多组case,不超过120组,每组输入为一行原创 2016-07-23 10:14:05 · 1086 阅读 · 0 评论 -
dinic模板 当前弧+多路增广
题目:http://poj.org/problem?id=3469 实测发现,当前弧、多路增广和当前弧+多路增广这三种优化其实差不多。。。但还是留个模板吧只有当前弧:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namesp原创 2017-04-21 20:43:35 · 966 阅读 · 0 评论 -
欧拉函数模板
欧拉函数:在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。 欧拉函数公式:ϕ(n)=n∏(1−1p)\phi(n)=n\prod(1-\frac{1}{p}),其中pp是可以整除nn的素数 根据公式,写出如下程序: 求单个数的欧拉函数:int Phi(int n) { int res = n; int m = (int)sqrt(n原创 2017-04-19 20:03:10 · 788 阅读 · 0 评论 -
RMQ - ST算法
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量转载 2016-07-19 12:00:49 · 404 阅读 · 0 评论 -
POJ 3164 Command Network 最小树形图模板
题目:http://poj.org/problem?id=3164题意:有n个点,给出这n个点的坐标。然后有m对点,意为可以在两点之间连一条有向边,花费为两点距离。问能不能连一些边使从1出发可以到达其他所有点,若可以求出最小花费思路:最小树形图模板题。首先为除根之外的每点选定一条权值最小的入边,如果这个入边集不存在有向环的话,该图的最小树形图。如果存在有向环的话,将这个有向环缩成一个人工顶原创 2016-09-25 14:48:29 · 324 阅读 · 0 评论 -
POJ 1330 Nearest Common Ancestors 倍增法求LCA
题目:http://poj.org/problem?id=1330题意:给定一个有向树,求树中两点的LCA思路:倍增法,留个模板。这个讲的不错点这里#include #include #include #include #include using namespace std;const int N = 10010;const int INF = 0x3f3f3f3f;原创 2016-08-16 11:17:05 · 857 阅读 · 0 评论 -
在线lca算法模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2586题意:求树上两点间距离#include #include #include #include #include using namespace std;const int N = 100100;struct edge{ int to, cost, next;}g[N原创 2016-07-19 16:14:14 · 823 阅读 · 0 评论 -
HDU 2222 Keywords Search ac自动机模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2222题意:给一些模式串,最后一个目标串,问目标串中模式串的个数思路:ac自动机模板题,存个档#include #include #include #include #define debug puts("here")using namespace std;const int N原创 2016-07-29 15:58:22 · 411 阅读 · 0 评论 -
HDU 1686 Oulipo kmp模板
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1686题意:给一个模式串,一个目标串,问目标串中有几个模式串思路:kmp模板题,留个模板。。。#include #include #include #include using namespace std;const int N = 10010;char s1[N], s2[N*1原创 2016-07-23 16:24:58 · 342 阅读 · 0 评论 -
数学模板
组合数学: CmnC_n^m的奇偶性:当n&m=mn \& m = m时,CmnC_n^m为奇数,否则为偶数原创 2017-08-23 10:17:14 · 295 阅读 · 0 评论 -
博弈论模板
尼姆博弈: 描述:有n堆石子,每堆若干个,两个人轮流从某一堆取任意多石子,规定每次至少取1个,多者不限,最后取光者得胜 结论:对n个石子数进行异或运算,结果不为0,先手胜,否则后手胜#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 110;int main(){ int n;原创 2017-08-25 11:06:41 · 611 阅读 · 0 评论 -
强连通分量模板
tarjan:const int N = 100010;struct edge{ int to, next;}g[N];int cnt, head[N];int dfn[N], low[N], scc[N], scc_sz[N], st[N];//scc标记点属于哪个强连通分量,scc_sz记录某个强连通分量的点数bool vis[N];int index, top, num;原创 2017-08-26 19:19:16 · 301 阅读 · 0 评论 -
二分图匹配模板
匈牙利算法:typedef long long ll;const int N = 110;struct edge{ int to, next;}g[N*N*2];int cnt, head[N];int nx, ny, match[N]; //nx,ny分别是左点集和右点集点数bool vis[N];void init(){ cnt = 0; memset(原创 2017-08-26 21:36:58 · 258 阅读 · 0 评论 -
字符串回文算法模板
manacher:const int N = 200010;char ori[N], pat[N*2];int p[N*2];int manacher(char *ori){ int len = strlen(ori + 1); for(int i = 1; i <= len; i++) pat[i*2] = ori[i], pat[i*2+1] = '#';原创 2017-08-26 20:00:06 · 385 阅读 · 0 评论 -
RMQ(ST)模板
一维RMQ://先调用ST函数预处理,然后调用RMQ查询const int N = 100010; int dp[20][N], a[N]; void ST(int n) {//dp[i][j]:以j为起点,长度为2^i的区间的最值 for(int i = 1; i <= n; i++) dp[0][i] = a[i]; for(int i原创 2017-08-26 19:46:05 · 225 阅读 · 0 评论