Template
Bzdhxs_nt
这个作者很懒,什么都没留下…
展开
-
最小区间覆盖
1原创 2022-08-04 04:28:56 · 277 阅读 · 1 评论 -
Kruskal 重构树
Kruskal 重构树原创 2022-07-19 23:09:15 · 181 阅读 · 0 评论 -
区间合并板子
时间复杂度 O(n)O(n)O(n)贪心using pll = pair<int,int>;vector<pll> seg;void merge(){ vector<pll> res; int st = -inf,ed = -inf; for(auto s:seg){ if(ed < s.first){ if(st!=-inf) res.push_back({st,ed});原创 2022-04-21 19:35:51 · 123 阅读 · 0 评论 -
平面半交板子
Test P4196 [CQOI2006]凸多边形 /【模板】半平面交#include<bits/stdc++.h>using namespace std;typedef pair<double,double> pdd;#define x first#define y secondconst double eps = 1e-8;struct Line{ pdd st,ed;};int sgn(double x){ if(fabs(x) < e原创 2022-04-20 21:11:41 · 166 阅读 · 0 评论 -
求解凸包的两种算法
Graham 算法O(n∗logn)O(n*logn)O(n∗logn)求得凸包点按逆时针转Templateint dcmp(double x, double y){ if(fabs(x - y) < eps) return 0; if(x > y) return 1; return -1;}struct Point{ double x,y; Point(double x = 0,double y = 0):x(原创 2022-04-19 17:52:53 · 279 阅读 · 0 评论 -
ST表模板
Templateint f[MAXN][21];void ST(){ // 不用初始化 forr(i,1,n) f[i][0] = b[i]; forr(i,1,20)for(int j = 1;j+(1<<i)-1 <= n;j++){ f[j][i] = max(f[j][i-1],f[j+(1<<(i-1))][i-1]); }}int query(int l,int r){ int s = __lg(r-原创 2022-04-11 17:49:14 · 93 阅读 · 0 评论 -
「Tarjan」无向图强连通分量
学习资源https://www.bilibili.com/video/BV1Q7411e7bM?spm_id_from=333.337.search-card.all.click代码实现-- 算法进阶指南 lydlydlyd结论(法则)1.割点判定法则判断点 xxx 是否为割点,对应边为 x→yx \rightarrow yx→y若xxx不为根节点,low[y]>=dfn[x]low[y] >= dfn[x]low[y]>=dfn[x],则 xxx 为割点若 xxx 为原创 2022-04-08 21:28:21 · 544 阅读 · 0 评论 -
「Tarjan」有向图强连通分量
内容tarjan求解有向图强连通分量tarjan求无向图割点与桥,tarjan解决2-SAT问题Tarjan求有向图强连通分量学习资源https://www.bilibili.com/video/BV19J411J7AZ?spm_id_from=333.337.search-card.all.click算法竞赛进阶指南-lyd一些结论有向图Tarjan缩点后图为拓扑图且与连通分量相反有向图转化为强连通分量图需要加 max(p,q)max(p,q)max(p,q) 条边,其中pp原创 2022-04-08 20:13:11 · 409 阅读 · 0 评论 -
线性筛+质因数分解优化
快速分解质因数,就是我们改变线性筛中的标记数组即vis数组的含义,将其改编为vis[i]表示为i的最小质因子,这样我们就能在O(质因子个数)的复杂度下分解质因数,而传统的分解质因数方法,在数据较强的情况下会被卡来自vector<pair<int, int>> d; int last = vis[x], t = 1; x /= vis[x]; while (vis[x] > 1) { if (vis[x] == last) { t++; } else转载 2022-03-28 17:19:34 · 304 阅读 · 0 评论 -
组合数相关
线性求组合数板子int fac[N << 1],invfac[N << 1];int C(int n,int m){ return n < m ? 0 : (long long)fac[n] * invfac[m] % mod * invfac[n - m] % mod;}void init(){ // i最大值为数据量 fac[0]=invfac[0]=invfac[1]=1; for(int i=1;i<=2e6 + 10;i++原创 2022-03-14 20:48:56 · 363 阅读 · 0 评论 -
次短路模板 G. Counting Shortcuts & poj3463
大意次短路模板+记数在跑dij的过程中考虑四种情况更新最短路和次短路,以及其数量更新最短路,最短路更新为次短路,相应路径数转移,注意次短路入队条件,最短路入队等于最短路,更新最短路路径数大于最短路小于次短路,更新次短路,次短路路径数转移,入队等于次短路,更新次短路路径数计数数组初始化为1/* *@author:bzdhxs *@date:2022/03/09 *@URL:http://poj.org/problem?id=3463 最短路 + 次短原创 2022-03-14 20:46:11 · 196 阅读 · 0 评论 -
数位dp学习记录
欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片原创 2022-03-10 23:41:17 · 74 阅读 · 0 评论 -
「template」 二分图相关
染色法判二分图bool dfs(int x,int c){ color[x] = c; for(int i = h[x];i;i = e[i].ne){ int v = e[i].to; if(!color[v] && !dfs(v,!c)) return false; else if(color[v] == c) return false; } return true;}bool check(){ mem(color,-1); bool lab =原创 2021-11-24 00:36:38 · 204 阅读 · 0 评论 -
.py 对拍 code
import sysimport osimport randomimport timecase = 0RED = '\033[0;31m'GREEN = '\033[0;32m'NC = '\033[0m'BOLD = '\033[1m'while True: case += 1 gen = open("input.in", "w") # 生成测试数据 t = 1 gen.write("{}\n".format(t)) n = random.原创 2021-11-21 19:49:14 · 303 阅读 · 0 评论 -
「Template」 KMP
…// kmp -- index begin zeroint ne[N];void get_next(string p){ ne[0] = -1,ne[1] = 0; // 非常重要的初始化操作; int i = 1, k = 0; // 从一开始计算next数组; while(i < p.size()){ if(k < 0 || p[i] == p[k]) ne[++i] = ++k; else k = ne[k]; }}int/void kmp(string原创 2021-11-11 01:07:12 · 201 阅读 · 0 评论 -
最长上升子序列板子
Tameplate// dp o(n^2)// f[i]: 以a[i]结尾的最长上升子序列的长度;// 状态划分: 考虑前 j 个 字串 ( 1 <= j < i);for(int i = 1; i <= n;i++){ f[i] = 1; for(int j = 1; j < i;j++){ if(a[i] > a[j]) f[i] = max(f[i],f[j]+1); }}cout << *max_element(f+1,f+1+n)原创 2021-10-26 00:03:31 · 85 阅读 · 0 评论 -
一道题学习求树的直径的两种方法--- 树的直径模板;
树的直径板子一. 两次 bfs/dfs;可行的原因是有个性质,从树的任意结点遍历整棵树,最后会到达直径的一个端点,然后再用这个端点再遍历一次树就可以得到树的直径;// 前向行建边void bfs(int u){ mem(st,0); queue<int> q; q.push(u); st[u] = 1; while(q.size()){ int t = q.front(); q.pop(); for原创 2021-10-06 00:58:30 · 345 阅读 · 0 评论 -
并查集(union-find disjoint sets)板子
并查集核心代码//find 函数int pre[x] // 维护祖宗节点;int d[x]// x 到pre[x]的权值;int find(int x){ return x == pre[x]?:x:pre[x] == find(pre[x]);}//带权并查集find函数int find(int x){ if(x != pre[x]){ int u = find(pre[x]); d[x] += d[p[x]]; //d[x]的初始化根据题意,经典例题:食物链; p[x] =原创 2021-08-21 15:13:46 · 84 阅读 · 0 评论 -
Trie树模板
TemplateTrie树//@yxc int son[N][26];int cnt[N],idx;void insert(char *str){ int p = 0; for(int i = 0;str[i];i++){ int u = str[i] - 'a'; if(!son[p][u]) son[p][u] = ++idx; p = son[p][u]; } cnt[p]++;}//查询字符串出现的次数int query(char *str){ int p原创 2021-08-04 16:47:37 · 153 阅读 · 0 评论 -
对顶堆模板
Template一.求中位数;priority_queue<int> h// 大根堆;priority_queue<int,vector<int>,greater<int>> g//小根堆;void insert(int x)//对顶堆求中位数模板{ if(!h.size()||x <= h.top()) h.push(x); else g.push(x); //对弹 if(g.size()>h.size()+1) h.push原创 2021-07-22 19:12:04 · 120 阅读 · 0 评论 -
两球相交体积计算
注意一下两球的位置关系dis=(o1,o2)dis = (o_1,o_2)dis=(o1,o2)h1=r1−(r12+dis2−r22)/(2∗dis)h1 =r_1-(r_1^2+dis^2-r_2^2)/(2*dis)h1=r1−(r12+dis2−r22)/(2∗dis)h2=r2−(r22+dis2−r12)/(2∗dis)h2 =r_2-(r_2^2+dis^2-r_1^2)/(2*dis)h2=r2−(r22+dis2−r12)/(2∗dis)V=πh12(r1−13h.原创 2021-07-22 11:48:18 · 1022 阅读 · 0 评论 -
单调栈模板
Template// @yxc 单调栈模板int h[N];//存初始数据;int stk[N];//模拟stack// 从左往右扫一遍;// 栈内存下标/值,栈存下标就要更具题意注意边界的初始化问题;//处理右边从右往左扫一遍;int tt = 0;//栈指针;for(int i = 1; i <= n;i++){ while(tt && h[stk[tt]] >= h[i]) tt--; //单调递增栈 // q[tt] 就是左边第一个比h[i]小的元素原创 2021-07-21 20:06:33 · 98 阅读 · 0 评论 -
拓扑排序板子
Template://用bfs求DAG的拓扑序列;void topsort(){ int hh =0,tt = -1; for(int i = 1; i <= n; i++) if(!in[i]) q[++tt] = i; while(hh <= tt){ int j = q[hh++]; for(.......)//邻接表or前向星 { int v = vct[j][i]/e[i].to; if(--in[v] == 0) q[++tt] = v; }原创 2021-07-21 15:01:39 · 124 阅读 · 0 评论 -
树状数组板子
int lowbit(int x){ return x&-x;}void update(int x, int k){ for(int i = x; i <= n; i += lowbit(i)) t[i] += k;}int query(int x){ ll sum = 0; for(int i = x; i;i -= lowbit(i)) sum += t[i]; return sum; }树状数组是动态维护前缀和的数据结构通过维护差分数组可以在原创 2021-07-15 16:40:41 · 119 阅读 · 0 评论 -
基础线段树板子
变量声明//结构体struct segment_tree{ ll l, r,sum,lz;}t[N<<2];//开大约四倍;int a[N];//点信息;上升和下沉void pushup(i){...};void pushdown(i){...};建树// 建树void build(int i,int l,int r){ t[i].l = l,t[i].r = r; if(l == r){ t[i].sum = a[l]; return ; } i原创 2021-07-15 10:32:04 · 70 阅读 · 0 评论 -
树上差分模板
点差分对于一组方向(s,t)(s,t)(s,t) 点差分操作为: ds←ds \leftarrowds← ds+kds+kds+k; dt←dt \leftarrowdt← dt+kdt+kdt+k; dlca←d_{lca} \leftarrowdlca← dlca−kd_{lca}-kdlca−k; dfa(lca)←d_{fa(lca)} \leftarrowdfa(lca)← dfa(lca)−kd_{fa(lca)}-kdfa(lca)−k;其中 kkk 为原创 2021-05-25 16:12:32 · 88 阅读 · 0 评论 -
LCA-倍增算法模板+树上前缀和例题
//lca 倍增templatevoid dfs(int cur,int fath){ if(st[cur]) return ; st[cur] = 1; dep[cur] = dep[fath]+1; fa[cur][0] = fath; for(int i = 1; i <= lg[dep[cur];i++) fa[cur][i] = fa[fa[cur][i-1]][i-1]; for(int i = h[cur];i != -1; i = e[i].ne) { int原创 2021-05-18 19:01:28 · 434 阅读 · 0 评论 -
一维差分模板
复习// a[N] 原数组, b[N] 差分数组 for(int i = 1; i <= n ;i++) { cin >> a[i]; b[i] = a[i] - a[i-1]; } int l,r,k; while (m -- ) { cin >> l >> r >> k; b[l] += k; b[r+1] -= k;原创 2021-05-17 21:21:16 · 65 阅读 · 0 评论