模板
Zeolim
这个作者很懒,什么都没留下…
展开
-
[算法]parition求TopK
parition算法是用于解决TopK问题代价最小的算法之一时间O(n) 空间O(1)算法流程:引入随机化选取一个枢轴并与尾元素交换 将区间内元素排为小于枢轴在前,大于枢轴在后的形式 使得i-lst大于等于枢轴 比较i与k大小递归处理 返回元素class Solution {public: int findKthLargest(vector<int>&...原创 2020-01-30 18:03:46 · 287 阅读 · 0 评论 -
[LCA] 最近公共祖先
最近公共祖先求法很多, 各有优略LCA步骤及原理:例题:http://acm.hdu.edu.cn/showproblem.php?pid=2586代码:LCA倍增法DFS + 向前星版预处理DEG 为log2(n) + 1#include <bits/stdc++.h>typedef long long ll;typedef long doub...原创 2019-05-05 10:47:23 · 155 阅读 · 0 评论 -
[模板] 区间筛素数
原理:一个数的倍数肯定不是素数若给定子区间[fst, lst]则必有区间内任意数最大的因子是sqrt(lst);因此只需要将2 - sqrt(lst)中的所有质数的倍数从区间[fst, lst]中划掉即可剩下的就是区间内的素数注意两个情况1. 第一次筛出的素数就在区间里 要特判2. 将区间[fst, lst]映射入[0, lst - fst]3.bitset优...原创 2019-04-25 19:23:13 · 368 阅读 · 0 评论 -
[模板] [拓扑序列]
拓扑序列有很多用途, 比如判环, 将树上 / 图上的问题转化为序列上的问题再处理等等寻找过程就是不断找入度为0的点添加到Q尾部如果得到的拓扑序列长度不等于N 则说明有环void toposort(int n){ queue <int> Q; for(int i = 0; i < n; ++i) { if(deg[i] == 0) Q.push(i...原创 2019-04-25 19:24:12 · 312 阅读 · 0 评论 -
[hash] 哈希的简单入门
算法竞赛中的哈希是往往是种种概率/玄学但是又贼鸡儿快方便的神奇算法本质是通过对目标数据建立唯一映射进行缩小数据规模的权值判断, 常常可以乱搞一些题目对循环数组的hashhttps://www.acwing.com/problem/content/139/解题思路: 对每个六元组求最小表示, 然后用乘积与和对应的双hash映射入一个链表 再判断即可字符串哈希http...原创 2019-05-05 10:48:56 · 260 阅读 · 0 评论 -
[模板][倍增] ST算法 RMQ 区间中最大得值
ST算法是区间倍增保存信息的典型例子树高log2(n) + 1, 第i行的每个结点保存从原数组当前位之后 (1 << (i - 1)) 的最大值很容易发现最大值不断传递并符合通式rmq[i][j] = max(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1) )]);查询时把区间分成可以交叉的两部分 l 到 l + 2...原创 2019-04-07 09:24:42 · 219 阅读 · 0 评论 -
[模板][二分]倍增及其应用
基础入门给定数组 和 数字T, 求最大位置K 满足 sum(1 - k)<= t;最简单的想法就是 前缀和 + 二分, 每次查询时间复杂度log(n), 对于数列最左端的数据没有必要这里的倍增可以理解为二分的改良优化版,设K点为0, P点为11. 每次试从当前点K往后加P个数是否小于T以log速度快速使K逼近答案点2.随后再把P值快速缩向条件1, 返回1当P...原创 2019-04-07 09:25:48 · 264 阅读 · 0 评论 -
[模板]三分搜索
三分思想是二分的一个简单延展二分区间要求是简单线性变换而对于二次函数等单 峰 / 谷 函数无法获得正确的逼近趋向而三分搜索可以解决这样的问题设左右两三分点 X, Y若F(X) > F(Y) 则有 X = A&&Y = B 或 X = A &&Y = C; 则必定有峰在X 右侧同理 则必定...原创 2019-03-13 19:05:39 · 184 阅读 · 0 评论 -
[杂谈]关于GCC128位大整数的使用
GCC官方提供了int128 (有符号128位整数)uint128 (无符号128位整数)两种变量类型, 但是windows环境下大多编译器无法编译OnlineJudge 主要是linux环境 所以平时用ubuntu / linux环境的在线编译器 刷题还是比较贴近竞赛环境的GCC库自带 IO 没有提供对 int128环境的支持 所以需要自己编译读入读出模板:void...原创 2019-03-11 10:08:22 · 2438 阅读 · 2 评论 -
[数据结构] 对顶堆求中位数
中位数求法比较多 离线的我不会比较容易实现的就是 在线的对顶堆对顶堆的定义:小顶堆存 大于小顶堆堆顶 的 所有元素 大顶堆存 小于大顶堆堆顶 的 所有元素那么 小顶堆和大顶堆堆顶 就是整个 当前数据元素 的 分界线并且 堆顶对换/互相插入 不影响定义性质那么当求中位数时 只需调堆即可得益于堆的性质 每次调堆时间复杂度为log(n)1.当前总元素量为奇数时只...原创 2019-03-19 10:35:23 · 811 阅读 · 1 评论 -
[模板][字符串] 最小表示
字符串最小表示:给定一循环字符串,求出位置k使得从k位置开始的字符串字典序最小解法 : 设双指针i, j 比较 s[i] 与 s[j] 的关系若s[i] == s[j] 则以i,j开头的两字符的大小关系目前是相同的直接向后, 找到第一个不同点i,j 若有s[i + k]> s[j + k], 则必有以i - i + k开头的字符串非最小 废话反之亦然 这一大部分可以...原创 2019-04-07 09:18:50 · 223 阅读 · 0 评论 -
[模板][图论]二分图匹配
递归查询nxt数组记录下一个可能值依次搜索出最大匹配值正确性已被证明在此不做赘述int k, n, m;const int MAXN = 520;vector <int> edge[MAXN];int used[MAXN] = {0};int nxt[MAXN] = {0};bool rfind(int x){ for(int i = 0;...原创 2019-03-07 18:07:32 · 119 阅读 · 0 评论 -
矩阵十进制快速幂
因为矩阵的运算性质,所以欧拉降幂这种骚操作是假的;而对于a的b次方非常大时就只能用的十进制快速幂 或者 奇怪的循环节性质解决例题:已知数列给定求数列第 N 项 同时对 M 取模。则有公式:然后套十进制快速幂求解即可#include<bits/stdc++.h>typedef long long ll;using namespace std...原创 2019-08-01 20:17:08 · 251 阅读 · 0 评论 -
[模板] 扫描线
一、扫描线求矩形面积并如图所示 总矩形面积并等于每两根蓝线间的面积和。考虑将矩形按x轴排序,只需要知道每个离散的x点上被矩形覆盖的长度, 和下一条扫描线的x轴可知之间面积为所以只需要维护每一条扫描线的长度即可,线段树暴力维护题目链接https://vjudge.net/problem/POJ-1151线段树维护const int MAXN = 1e6 + 1...原创 2019-08-13 20:42:01 · 491 阅读 · 0 评论 -
[模板]多边形面积交
1.必须逆时针给出多边形顶点2.面积并 = 面积和 - 面积交#include <bits/stdc++.h>using namespace std;const int maxn = 300;const double eps = 1e-8;int dcmp(double x){ //精度误差比较 if(x > eps) return 1...原创 2019-10-07 22:29:18 · 171 阅读 · 0 评论 -
[模板]离散化
struct lsh{ int v[MAXN], vl; lsh() { vl = 0; } void pb(int val) { v[vl++] = val; } //向后加元素 void init() { sort(v, v + vl); vl = unique(v, v + vl) - v; } //初始化排序,重置大小 int find(int val) { retur...原创 2019-09-15 17:47:00 · 111 阅读 · 0 评论 -
[模板] 树状数组及其应用
树状数组树状数组又是一个区间查询修改利器 前缀和的维护 差分的维护又强又方便二进制组合原理struct bit{ ll c[MAXN], N; //c树, N数组长 bit() {} bit(int n) { N = n; fill(c, c + N + 1, 0); } //初始化数组长 int lowbit(int x) { return x &...原创 2019-04-14 18:53:26 · 153 阅读 · 0 评论 -
[模板]序列自动机
仅作整理struct substr{ vector <int> st[256]; void init(char *x, int len) { for(int i = 0; i < len; ++i) { st[x[i]].push_back(i); } } bool isub(char *x, int len) { int now...原创 2019-09-06 21:38:33 · 146 阅读 · 0 评论 -
[Trie] 最长异或值路径
异或最值问题是Trie的拿手强项看到异或应该先想Trie和前缀和给定一个树,树上的边都具有权值。树中一条路径的异或长度被定义为路径上所有边的权值的异或和:⊕ 为异或符号。给定上述的具有n个节点的树,你能找到异或长度最大的路径吗?输入格式第一行包含整数n,表示树的节点数目。接下来n-1行,每行包括三个整数u,v,w,表示节点u和节点v之间有一条边权重为w。...原创 2019-05-05 10:49:01 · 289 阅读 · 0 评论 -
[组合数]lucas定理 排列组合取模
lucas: 计算 C 时 当 n, m范围大 mod范围小时可以将 n m 缩减至 mod 范围内计算预处理: 当 n m 范围小 mod 范围大时可以预处理阶乘逆元 O(1)计算const int FN = 1e5 + 10;const int MOD = 1e9 + 7;ll fac[FN] = {1, 1}, inv[FN] = {1,1}, f[FN] = {1,1};...原创 2019-05-05 10:50:23 · 602 阅读 · 0 评论 -
[暴力]分块
优化暴力算法分sqrt(n)个区间进行维护复杂度3 sqrt(n) = sqrt(n)代码: 建块int n, m;ll arr[MAXN] = {0}; //原数组ll belong[MAXN], bsize = 0; //对应块 块大小ll fst[MAXN], lst[MAXN], rmax[MAXN] = {0}; //对应块起始地址 块维护信息void bui...原创 2019-05-21 12:18:35 · 489 阅读 · 0 评论 -
[模板][最大流]dinic
最大流 = 最小割#pragma GCC optimize(2)#include <bits/stdc++.h>#define m(x) memset(x, 0, sizeof(x))using namespace std;typedef long long ll;const int MAXN = 1e6 + 10; ll inf = ll(1) <<...原创 2019-08-06 09:49:44 · 129 阅读 · 0 评论 -
[模板]主席树及其应用
可持久化权值线段树;root数组记录第i版本根, 每次建树时只新建当前位相关子节点, 不相关子节点直接用上一版本的原节点有前缀和及权值树性质, 可区间查询k小数1.查询区间第k小#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>...原创 2019-05-14 18:29:59 · 464 阅读 · 0 评论 -
[模板] 负环
spfa求负环,玄学复杂度int head[MAXN] = {0}, tot = 0;void init(){ mem(head); tot = 0; }struct node { int from, to, val, nex; } edge[MAXN << 1];int add(int x, int y, int z){ edge[++tot].to = y;...原创 2019-09-04 16:46:07 · 133 阅读 · 0 评论 -
[SGT] 线段树维护区间最大子段和
蓝书P208https://vjudge.net/problem/SPOJ-GSS1若将一区间分为两部分,则必有最大子段存在于左区间 / 右区间 / 跨越中间因此当前节点记录该段的最大前缀和,最大后缀和,段和,区间内最大子段和 now.sum = ls.sum + rs.sum; now.lmax = max(ls.lmax, ls.sum + rs.lmax); now.r...原创 2019-08-09 16:03:53 · 329 阅读 · 0 评论 -
[可持久化01Trie] BZOJ 3261 最大异或和
给定一个非负整数序列{a},初始长度为N。有M个操作,有以下两种操作类型:1、Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。2、Qlrx:询问操作,你需要找到一个位置p,满足l<=p<=r,使得:a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少。Input第一行包含两个整数 N ,M,含义如问...原创 2019-09-03 09:23:49 · 206 阅读 · 0 评论 -
[模板]前缀树 / 字典树及应用
前缀树 / 字典树是最简单的树了欠的总是要还的O(n)算法的多叉树比较好理解没啥解释的了用数组模拟 行结点 列指针 cnt记录最大结点编号直接上代码吧可持久化01字典树struct trie{ int cnt, root[MAXN], tr[MAXN * 25][2], sum[MAXN * 25];//结点总个数 版本进入根 树 结点...原创 2019-03-14 17:02:48 · 354 阅读 · 0 评论 -
[模板] 康托展开和逆展开
感谢ZLY告诉我这个知识点附上比较不错的模板https://www.cnblogs.com/Howe-Young/p/4348777.html例题:http://nyoj.top/problem/139(康托展开)http://nyoj.top/problem/143(康托逆展开)此题是理解康托展开非常好的例子就该题而言会不会康托展开都会想到用排列组合计算比该序列小的序...原创 2019-03-10 11:07:59 · 289 阅读 · 0 评论 -
[模板] 球 体积交 体积并
两点间距离公式 dis = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2) + (z1 - z2) * (z1 - z2)); //算球心距离球体积 4.0 / 3.0 * PI * r * r * r;球缺体积PI * h* h*(r- h/ 3.0);typedef long double ld; const ld pi...原创 2019-03-02 09:57:18 · 408 阅读 · 0 评论 -
[DP] [模板] 01背包
1.标准模板以横轴坐标为体积以纵轴坐标为当前物品至首物品则 dp[i][j] 即为 OPT(体积j, 物品1 - i)//#pragma GCC optimize(2)#include <cstdio>#include <iostream>#include <cstdlib>#include <cmath>#include...原创 2018-08-11 15:14:12 · 155 阅读 · 0 评论 -
[模板][线段树]
1.区间加和求极值lazy#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 10;typedef long long ll;const ll MOD = 1e9 + 7;const int MX = 1e5 + 7;int arr[MAXN] = {0};struct sgt...原创 2018-08-11 12:42:29 · 170 阅读 · 0 评论 -
[链表(linked list)] [洛谷] P1160 队列安排
模拟链表#include <iostream>using namespace std;const int MAXN = 1e5 + 10;int head = 1;struct num{ int right; int left;}arr[MAXN];void joinl(int x, int y){ arr[x].left = ...原创 2018-07-28 14:15:54 · 243 阅读 · 0 评论 -
[模板] [KMP] 字符串匹配
拓展kmpint Next[MAXN], extand[MAXN];char s[MAXN];void getNext(char *T){// Next[i]: 以第i位置开始的子串 与 T的公共前缀 int i, length = strlen(T); Next[0] = length; for(i = 0; i < length - 1 && T...原创 2018-08-04 11:20:22 · 160 阅读 · 0 评论 -
[模板] [洛谷] 线性筛素数 P3383 P1865
P3383 线性筛素数重复筛bool check[maxn];ll n, m;void initprime(){ check[1] = check[0] = true; for(int i = 2; i <= n; i ++) { if(!check[i]) { for(int j = 2...原创 2018-07-30 17:17:44 · 204 阅读 · 0 评论 -
[模板] 并查集
#include <iostream>using namespace std;const int MAXN = 1e4 + 10;int arr[MAXN];int N, M;void init(int N) //初始化根节点为自己{ for(int i = 1; i <= N; i++) ar...原创 2018-07-27 11:00:26 · 130 阅读 · 0 评论 -
[模板] 快速幂
qpow 快速幂 #include <iostream>using namespace std;typedef long long ll;ll N, M, MOD;ll qpow(ll a, ll b){ ll ans = 1; a %= MOD; //预处理 while(b) { if(b&1) ...原创 2018-07-25 17:53:45 · 159 阅读 · 0 评论 -
[模板]排序
1.快速排序 #include <iostream>using namespace std;const int MAXN = 2e5 + 10;int arr[MAXN];int len;void qsort(int arr[], int fst, int lst){ int i = fst, j = lst; int mid =...原创 2018-07-25 16:15:25 · 168 阅读 · 0 评论 -
[模板] 乘法逆元及其应用 (51nod 1013 3的幂的和)
1.拓展欧几里得求逆元#include <bits/stdc++.h>typedef long long ll;using namespace std;ll x,y;ll eggcd(ll m,ll n){ if(n==0) { x=1; y=0; return m; } int r=egg...原创 2018-05-23 17:11:18 · 178 阅读 · 0 评论 -
[模板] 结构体使用CMP SORT 二分 的技巧 (重载) 应用51nod 四个数和为零
一千组数据,枚举出所有任意两个数的组合,一共1000 * 1000组记录组合来的下标 然后二分查相反数并查重。#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int MAXN = 1010;int a[MAXN] ;str...原创 2018-05-21 21:10:56 · 240 阅读 · 0 评论 -
[模板] [高精度] 大数加减 大数乘法 51NOD 1005/1027
给出2个大整数A,B,计算A+B的结果。Input第1行:大数A第2行:大数B(A,B的长度 <= 10000 需注意:A B有可能为负数)Output输出A + BInput示例68932147586468711654886Output示例537643802472 减法还有点凌乱,慢慢整理, 符号判断放在外面了,函数比较好...原创 2018-04-12 09:35:12 · 260 阅读 · 0 评论