算法竞赛
文章平均质量分 63
wzx_1210
这个作者很懒,什么都没留下…
展开
-
jiangly的并查集模板
并查集模板jls的并查集模板 orz orz orz orzstruct DSU { std::vector<int> p, siz; DSU(int n) : p(n+1), siz(n+1, 1) { std::iota(p.begin(), p.end(), 0); } int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); } bool same(int x, in原创 2022-04-13 17:03:24 · 2438 阅读 · 0 评论 -
倍增法求LCA模板封装
倍增法求LCA原理 树上的任意两点的最近公共祖先,是两点之间dfs序中的最小值。使用st表维护dfs序中的区间最小值。st[cnt][0]st[cnt][0]st[cnt][0]:树的dfsdfsdfs序,第cntcntcnt个遍历的点是st[cnt][0]st[cnt][0]st[cnt][0]dfn[x]dfn[x]dfn[x]:节点编号为x的节点,第一次出现在dfs序中的位置dep[x]dep[x]dep[x]:节点x在树中的深度模板struct LCA { /* $st[原创 2022-04-11 15:36:43 · 324 阅读 · 0 评论 -
分层图 例题+模板
分层图本质是在遍历图的过程中,有k条特殊边(包括但不限于,权重为0、逆向、权重减半等)。这时,我们只需建立k层图,每层图均与原图相同,每层图之间连接特殊边(权值为0的边、权值减半的边等)。模板一P4568 [JLOI2011]飞行路线题意:有k不超过k条免费的边,求最小花费。算法:分层图+地杰斯特拉注意:每层图的终点均需要连接一条免费边,避免k值大于路径。#include <bits/stdc++.h>#define pii pair<int, int>using原创 2022-02-23 15:19:56 · 312 阅读 · 0 评论 -
进阶图论算法汇总(LCA、强(双)连通分量、欧拉路径与欧拉回路、拓扑排序、01规划)-acwing算法提高课 acm
文章目录LCA向上标记法代码倍增法预处理 O(nlogn)O(nlogn)O(nlogn)询问 O(logn)O(logn)O(logn)代码Tarjan思路代码有向图的强连通分量 SCCTarjan用途算法思路模板例题一些结论无向图的双联通分量 DCC算法思路代码-边代码-点一些结论欧拉路径与欧拉回路判定思路技巧代码:[判定欧拉回路](https://www.acwing.com/problem/content/1186/)拓扑排序用途思路代码01规划用处思路代码差分约束二分图Floyd基础图论算法汇原创 2022-02-10 22:53:33 · 444 阅读 · 0 评论 -
LCA-最近公共祖先 向上标记法、倍增法、Tarjan
LCA向上标记法时间复杂度 O(n∗m)O(n*m)O(n∗m)如果两个结点不相同,就将较深的结点向上移动,直到移动到相同结点,那么该结点即为公共祖先结点。代码//预处理每个结点的深度,以及结点的父结点的编号void dfs(int u, int father){ depth[u]=depth[father]+1; fa[u]=father; for(int i=h[u];~i;i=ne[i]){ int v=e[i]; if(v!=fa原创 2022-02-07 22:45:59 · 372 阅读 · 0 评论 -
线段树扫描线(面积并、周长并)例题
扫描线问题概述算法核心:扫描。即有一根线从左侧扫描到右侧,在扫描过程中可以统计一些信息。其中对于扫描的每个x,存在垂直x轴的线段,线段信息用线段树维护(注意端点)。配套使用:离散化(y轴数据范围很大时候,不可能建立很大的线段树)、二分(查找离散化结果)、懒标记(对区间修改)注意:周长并和面积并的懒标记不需要下传(等同于cnt区间覆盖的次数)acwing 248. 窗内的星星思路因为我们已经知道了矩形的长和宽,所以对于任意一个星星(x, y, c), 都可以得到一个确切的矩形,所以每一个星星,原创 2022-01-28 11:30:56 · 928 阅读 · 0 评论 -
树状数组(单点修改|查询前缀和、单点修改|单点查询、单点修改|区间查询、区间修改|单点查询、区间修改|区间查询) 学习笔记+例题
树状数组算法作用动态维护前缀和、异或和、最大值、最小值单点修改|查询前缀和、单点修改|单点查询、单点修改|区间查询、区间修改|单点查询前置知识lowbit(x)运算:x&-x一些公式对于任意一个数xxx:t[x]t[x]t[x]保存以xxx为根的子树中叶节点的和.t[x]t[x]t[x]节点所覆盖的长度等于lowbit(x)lowbit(x)lowbit(x)t[x]t[x]t[x]节点的父节点为t[x+lowbit(x)]t[x+lowbit(x)]t[x+lowbit原创 2022-01-19 14:15:42 · 445 阅读 · 0 评论 -
基础图论算法汇总(最短路、最小生成树、二分图)- 算法竞赛acm
图论最短路Dijkstra(朴素版)算法作用求稠密图的单源最短路使用邻接矩阵存图算法思路初始化距离为正无穷,dis[1] = 0;循环迭代n次,每次可以确定一个点遍历该点的每一个节点,找到不在close_set中距离集合最近的点标记选中该点用该点更新其他点的距离dis[j] = min(dis[j], dis[t] + g[t][j]);代码#include<bits/stdc++.h>using namespace std;const int maxn原创 2022-01-19 00:31:02 · 815 阅读 · 0 评论 -
算法竞赛vscode配置指南(待更新)
竞赛vscode配置指南chapter 1 基础配置step 0. 排除风险打开cmd,输入whoami。 如果用户名是中文,建议更改用户名为英文,或新建一个用户名为英文的用户。所有安装路径推荐填写无中文、无空格等特殊字符的路径。step 1. 安装wingw-w64正常下载速度会比较慢,如下载困难,可使用下方百度云链接:https://pan.baidu.com/s/16Jec-xvAcWZ_LBktd0GsqA 提取码:lrgh解压文件, 这里以解压到C盘根目录为例原创 2022-01-15 18:37:46 · 1104 阅读 · 0 评论 -
acm-中位数问题-acwing(货仓选址、均分纸牌、糖果传递、七夕祭)
中位数问题acwing 104 货仓选址思路取坐标的中位数,作为仓库的位置。证明代码#include <bits/stdc++.h>#define endl "\n"using namespace std;const int maxn = 100010;int a[maxn];int res;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin &g原创 2021-11-20 21:58:23 · 290 阅读 · 0 评论 -
二分模板 + 讲解笔记
二分int upper_bound_search(int a[], int l, int r){ while(l < r){ int mid = l + r >> 1; if(check_upper(mid)) r = mid; else l = mid + 1; } return l;}int lower_bound_search(int a[], int l, int r){ while(l <原创 2021-10-09 09:33:16 · 52 阅读 · 0 评论 -
归并排序、快速排序模板
快速排序void q_sort_1(int a[], int l, int r){ if(l >= r) return; int x = a[l], i = l - 1, j = r + 1;// do..while()留出空余 while(i < j){//穿过 do i++; while(a[i] < x);//等于也停下 do j--; while(a[j] > x); if(i < j) swap原创 2021-10-09 09:31:06 · 50 阅读 · 0 评论 -
STL学习手册
STLC标准库strlen() 字符串长度strcmp() 字符串比较strcpy() 字符串拷贝memset() 暴力清空memcpy() 暴力拷贝三角函数、指数函数、浮点取整函数qsort() C语言快排rand() 随机数malloc() free() C语言动态分配内存time(0) 从1970年到现在的秒数(配合随机数)clock() 程序启动到目前位置的毫秒数isdigit(), isalpha(),判断字符是否为数字、大小写字母生成随机数//生成随机数原创 2021-10-09 08:34:19 · 503 阅读 · 0 评论 -
最全区间问题汇总(区间合并,区间选点,区间分组,区间覆盖)
区间问题汇总区间合并Description给定 nnn 个区间 [li,ri][li,ri][l_i,r_i][l_i,r_i][li,ri][li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:$[1,3][1,3] 和和和 [2,6][2,6] 可以合并为一个区间可以合并为一个区间可以合并为一个区间 [1,6][1,6]$。Input第一行包含整数 nnn。接下来 nnn 行,每行包含两个整数 lll 和 rrr。51原创 2021-10-04 17:10:49 · 397 阅读 · 0 评论 -
指针与引用学习笔记
指针与引用指针的基本用法指针的定义使用指针改变地址使用指针更改变量的值int *p = NULL;int a = 0, b = 5;p = &a; //指针的赋值:将a的内存地址赋值指针p*p = b; //指针的赋值:将(int)b=5的值赋给(int)a注:& 表示取址、* 表示取值&a 的数据类型为int型指针;*p数据类型为整型int结构体指针#incldue<iostream>using namespace std;struc原创 2021-09-29 19:34:19 · 69 阅读 · 0 评论 -
算法竞赛中C++的简单特性(构造函数、IO、new动态内存、重载)学习笔记
c++ 的特性结构体的构造函数#include<iostream>using namespace std;//构造函数的写法1struct st{ int a, b; st(int _a, int _b){ a = _a; b = _b; }};//构造函数的写法2struct st_{ int a, b; st_(int a_, int b_):a(a_), b(b_){} //st_(int原创 2021-09-29 19:29:00 · 105 阅读 · 0 评论 -
c++ 高精度模板 算法竞赛
大整数存储定义int型数组d[l000], 那么这个数组中的每一位就代表了存放的整数的每一位。如将整数235813 存储到数组中,则有d[0] = 3, d[l] = 1, d[2] = 8, d[3] = 5, d[4] = 3, d[5] = 2, 即整数的高位存储在数组的高位,整数的低位存储在数组的低位。struct bign{ int d[1005]; int len; bign(){ memset(d,0,sizeof(d)); len=原创 2021-09-29 19:12:57 · 145 阅读 · 0 评论