
Acwing笔记
文章平均质量分 89
会划水才能到达彼岸
ACM-ICPC 现役(铜牌) 目前:Codeforces Rating: 2172
展开
-
《算法从入门到入土系列》第四集 博弈论专题
《算法从入门到入土系列》第四集 博弈论专题博弈论专有名词及类型NIM游戏公平组合游戏ICG有向图游戏Mex运算SG函数有向图游戏的和NIM游戏台阶-Nm博弈 AcWing 892博弈论专题刷题博弈论HDU 1564(签到题)HDU 2516(斐波那契博弈)HDU 2897(类巴什博弈)【2020CCPC网络赛】1005 Lunch (类尼姆博弈)2021牛客寒假算法基础集训营3 J.加法和减法HDU 3389(类阶梯博弈)HDU 3863 (签到题)HDU 3951(环形巴什博弈)HDU 2188(标准巴原创 2021-04-14 23:35:17 · 319 阅读 · 1 评论 -
《算法从入门到入土系列》第三集<上> 计算几何专题(基础知识)
《算法从入门到入土系列》第三集 计算几何专题 题目解析 + 练习题单基础知识常用的一些公式前置知识题单POJ 2318(二分+叉积)POJ 2398()POJ 3304POJ 1269POJ 2653POJ 1066POJ 1410POJ 1696POJ 3347POJ 2826POJ 1039POJ 3449POJ 1584POJ 2074基础知识 计算几何是一个偏模拟的专题。几何大家都学过,应该都觉得挺简单的吧,从二维到三维思维的快乐跳跃,需要一些空间想想能力,让我们一起畅游几何学吧!计算几原创 2021-04-04 22:40:36 · 442 阅读 · 2 评论 -
《算法从入门到入土系列》第一集 搜索专题(DFS与BFS)题目解析 + 练习题单(更新ing)
搜索专题(DFS与BFS) 从入门到入土 题目解析 + 练习题单搜索BFSAcWing 844. 走迷宫Flood Fill 算法AcWing 1097. 池塘计数AcWing 1098. 城堡问题AcWing 1106. 山峰和山谷最短路模型AcWing 1076. 迷宫问题(单源最短路)AcWing 188. 武士风度的牛LUOGU P1443 马的遍历多源BFSAcWing 173. 矩阵距离最小步数模型AcWing 1107. 魔板双端队列广搜AcWing 175. 电路维修双向广搜AcWing 1原创 2021-03-22 20:17:09 · 4747 阅读 · 11 评论 -
Module1 —— 前缀和与差分
前缀和与差分前缀和差分前缀和差分原创 2021-01-18 17:48:01 · 229 阅读 · 0 评论 -
Module1 —— 整数二分的两个模板+浮点二分模板及应用
整数二分用二分的思想可以找出这个分界点。假设我们想二分出来红色(不满足条件的范围)这边的分界点:找一个中间值mid :l+r >> 1写一个函数check()判断时mid时在满足条件(绿色)范围内,还是在不满足条件(红色)范围内。(注意:这里为什么是 l+r+1 )For example:如果 l = r - 1 (即左右边界只相差1) ,假设为l+r >> 1 (向下取整)假设if(check(mid)) 判断为true (此时mid = l + r >&g原创 2021-01-17 13:45:41 · 205 阅读 · 0 评论 -
Module1 —— mergesort模板
归并排序模板归并排序模板题归并排序模拟图例题:逆序对的数量归并排序模板题给定你一个长度为n的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围:1≤n≤1000001≤n≤1000001≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5归并原创 2021-01-17 12:32:20 · 174 阅读 · 0 评论 -
Module1 —— Quicksort模板
Quicksort给定你一个长度为 nnn 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 nnn。第二行包含 nnn 个整数(所有整数均在 111 ~ 10910^9109 范围内),表示整个数列。输出格式输出共一行,包含 nnn 个整数,表示排好序的数列。数据范围:1≤n≤1000001≤n≤1000001≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5快速排序确原创 2021-01-15 21:13:26 · 299 阅读 · 1 评论 -
区间DP原理解析 和 kuangbin一些题
区间DP原理本质石子合并环形石子合并本质区间dp的本质其实是线性dp的一种。线性dp:从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态。区间dp中是以 “区间长度” 作为dp的阶段。区间dp的初始状态一般是长度为1的区间。NOIP 2006 提高组下面以例题(石子合并)分析:石子合并题目描述:设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量原创 2020-11-13 23:46:15 · 720 阅读 · 1 评论 -
图论 —— 最小生成树(朴素Prim原理及模板题)
最小生成树模板题以模板题为例子解释AC代码:(代码有详细的注释!)模板题给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图G=(V, E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。由V中的全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。输入格式第一行包含两个整数n和m。接下原创 2020-10-05 16:11:52 · 2219 阅读 · 7 评论 -
图论 —— 最短路问题
常见的最短路问题有哪些?源点: 起点 汇点: 终点边权: 离散数学或数据结构中,图的每条边上带的一个数值,他代表的含义可以是长度等等,这个值就是边权。1.单源最短路 (只有一个起点)求从一个点到其他所有点的最短距离,最常见的一个问题:从1号点到n号点的最短路(1) 所有边权都是正数 (其中n为点的数量,m为边的数量)朴素 Dijkstra 算法 时间复杂度 O(n^2) (如果是一个稠密图(存储用邻接矩阵),例如 m 和 n^2 是一个级别的就用朴素 Dijkstra 算法)原创 2020-10-04 14:12:05 · 581 阅读 · 0 评论 -
数据结构 —— 并查集(笔记及裸题)
并查集代码短但是特别精巧。将两个集合合并询问两个元素是否在一个集合当中(并查集的时间复杂度近乎O(1) )基本原理:每一个集合用一颗树来表示。树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点问题1:如何判断树根?如果是树根的话 → if(p[x] == x) ,除了根节点之外p[x] ≠ x问题2:如何求x的集合编号?while(p[x] != x) x = p[x];只要x不是树根,就一直往上走。其实就是解决第二点,询问两个元素是否在一个集合当中,分别原创 2020-09-29 11:05:04 · 295 阅读 · 0 评论 -
数学(一) 筛质数
筛质数的几种方法从例题 Acwing 868 来看给定一个正整数n,请你求出1~n中质数的个数。输入格式共一行,包含整数n。输出格式共一行,包含一个整数,表示1~n中质数的个数。数据范围1≤n≤1061≤n≤10^61≤n≤106输入样例:8输出样例:4#include<iostream>#include<cstdio>using namespace std;const int N = 1000010;int cnt=0;int prime[N原创 2020-09-12 11:58:09 · 273 阅读 · 1 评论 -
基础算法(3) —— 整数二分模板
二分整数二分用二分的思想可以找出这个分界点。假设我们想二分出来红色(不满足条件的范围)这边的分界点:找一个中间值mid :l+r >> 1写一个函数check()判断时mid时在满足条件(绿色)范围内,还是在不满足条件(红色)范围内。(注意:这里为什么是 l+r+1 )For example:如果 l = r - 1 (即左右边界只相差1) ,假设为l+r >> 1 (向下取整)假设if(check(mid)) 判断为true (此时mid = l + r >原创 2020-08-14 03:46:47 · 300 阅读 · 0 评论 -
基础算法(12) —— 位运算
位运算两种简单操作1. 求n的二进制表示中第k位是多少。步骤:①先把第k位移到最后一位 用 n>>k;②看个位是多少n>>k&1#include<iostream>#include<cstdio>#include<string>#include<cstring>using namespace std;int main(){ int n = 10; for(int k = 3; k >原创 2020-09-03 01:59:32 · 283 阅读 · 0 评论 -
Module1 —— 双指针算法
两个指针分别作用在两个序列(例如:归并排序)两个指针同时作用在同一个序列(例如:快速排序)一般的写法都长这样:for (int i = 0, j = 0; i < n; i++ ){ while (j < i && check(i, j)) j++ ; // 具体问题的逻辑}双指针的核心思想:优化for(int i = 0;i < n;i++) for(int j = 0;j < m;j++)时间复杂度为 O(n2原创 2020-09-02 14:17:53 · 203 阅读 · 0 评论 -
基础算法(10) —— 差分
一维差分a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1,a2,a3,...,an 前缀构造 b1,b2,b3,...,bnb_1,b_2,b_3,...,b_nb1,b2,b3,...,bn 差分使得:ai=b1+b2+...+bna_i=b_1+b_2+...+b_nai=b1+b2+...+bn(对b[ ]求前缀和就是a[ ]);其中:b1=a1b_1=a_1b1=a1;b2=a2−a1b_2=a_2-a_1b2=a2−a1;b原创 2020-09-02 10:14:48 · 320 阅读 · 0 评论 -
基础算法(9) —— 前缀和(一维+二维)
前缀和前缀和的定义:求前n项和例题:给定一个数列 an(1≤n≤100000){a_n}(1≤n≤100000)an(1≤n≤100000),有 q(1≤q≤100000)q(1≤q≤100000)q(1≤q≤100000)次询问,每次询问树立的第m个元素到第n个元素的和。如果是暴力解法:有q次询问,每次都要扫一遍这个区间,最大时间复杂度是O(q×n)O(q×n)O(q×n)优化:(前缀和)复杂度主要是在:q次查询,就是要扫q次区间。前缀和的思想: 开一个更大的数组,将对区间的查询,转换为对原创 2020-09-01 00:38:55 · 243 阅读 · 0 评论 -
基础算法(8) —— 高精度除法模板
高精度除法给定两个非负整数A,B,请你计算 A / B的商和余数。输入格式共两行,第一行包含整数A,第二行包含整数B。输出格式共两行,第一行输出所求的商,第二行输出所求余数。数据范围1≤A的长度≤100000,1≤A的长度≤100000,1≤A的长度≤100000,1≤B≤100001≤B≤100001≤B≤10000B一定不为0B 一定不为 0B一定不为0输入样例:72输出样例:31e#include<iostream>#include<cstdio原创 2020-08-31 23:21:35 · 256 阅读 · 0 评论 -
基础算法(7) —— 高精度乘法模板
高精度乘法给定两个正整数 AAA 和 BBB,请你计算A×BA × BA×B的值。输入格式共两行,第一行包含整数 AAA,第二行包含整数 BBB。输出格式共一行,包含 A×BA × BA×B的值。数据范围1≤A1≤A1≤A 的长度≤100000≤100000≤1000000≤B≤100000≤B≤100000≤B≤10000输入样例:23输出样例:6其中计算步骤为:C0=(3∗12)C_0=(3*12)C0=(3∗12) % 10=610=610=6t1=(3∗12)原创 2020-08-31 19:03:01 · 647 阅读 · 0 评论 -
基础算法(6) —— 高精度减法模板
高精度减法模板及例题:模板题:给定两个正整数,计算它们的差,计算结果可能为负数。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的差。数据范围1≤1≤1≤ 整数长度 ≤105≤105≤105输入样例:3211输出样例:21高精度减法步骤:用字符串储存输入数据将字符串转化成 vector数组(逆序)比较A,B的大小判断是否有 A≥BA≥BA≥B 的方法是:(1)判断A的位数与B的位数是否不相同: 不相同则返回A.size()>B原创 2020-08-31 11:58:37 · 266 阅读 · 0 评论 -
DFS 知识点以及模板题
DFS —— 不撞南墙不回溯 —— 死脑筋BFS —— 眼观六路耳听八方 —— 一层一层的搜索DFS :DFSBFSstack(栈)queue(队列)O(h)O(h)O(h)O(2h)O(2^h)O(2h)不具有最短路性质具有最短路性质原创 2020-08-20 02:59:13 · 314 阅读 · 0 评论 -
基础算法(5) —— 高精度加法模板
大整数相加 (高精)给定两个正整数,计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤1≤1≤ 整数长度 ≤100000≤100000≤100000输入样例:1223输出样例:35数组下标:0 1 2 3 4 5 6 7 8存储数字:9 8 7 6 5 4 3 2 1逆序存储,因为存在进位情况,可以用push_back在高位补上1(详情思路请看代码)#include<iostream>#include<ve原创 2020-08-15 17:36:24 · 200 阅读 · 0 评论 -
基础算法(4) —— 浮点数二分模板
浮点数二分用二分的思想可以找出这个分界点。假设我们想二分出来红色(不满足条件的范围)这边的分界点:找一个中间值mid :l+r >> 1(因为是浮点数,所以可以严格的二分,即mid就是中点)写一个函数check()判断时mid时在满足条件(绿色)范围内,还是在不满足条件(红色)范围内。当区间长度很小的时候,可以近似的认为找到了答案,例:r-l ≤ 10−6^{-6}−6 (如果题目要求保留4位小数,则应该写到-6次方,比有效小数的位数多2)例题:用二分法做一个sqrt函数 (只原创 2020-08-14 15:35:32 · 383 阅读 · 0 评论