算法系统学习
文章平均质量分 81
会划水才能到达彼岸
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 · 285 阅读 · 1 评论 -
《算法从入门到入土系列》第三集<上> 计算几何专题(基础知识)
《算法从入门到入土系列》第三集 计算几何专题 题目解析 + 练习题单基础知识常用的一些公式前置知识题单POJ 2318(二分+叉积)POJ 2398()POJ 3304POJ 1269POJ 2653POJ 1066POJ 1410POJ 1696POJ 3347POJ 2826POJ 1039POJ 3449POJ 1584POJ 2074基础知识 计算几何是一个偏模拟的专题。几何大家都学过,应该都觉得挺简单的吧,从二维到三维思维的快乐跳跃,需要一些空间想想能力,让我们一起畅游几何学吧!计算几原创 2021-04-04 22:40:36 · 397 阅读 · 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 · 4668 阅读 · 11 评论 -
区间DP原理解析 和 kuangbin一些题
区间DP原理本质石子合并环形石子合并本质区间dp的本质其实是线性dp的一种。线性dp:从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态。区间dp中是以 “区间长度” 作为dp的阶段。区间dp的初始状态一般是长度为1的区间。NOIP 2006 提高组下面以例题(石子合并)分析:石子合并题目描述:设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量原创 2020-11-13 23:46:15 · 653 阅读 · 1 评论 -
Leetcode 二叉树专题周
Leetcode 105.从前序与中序遍历序列构造二叉树(图文详解)本题思想:给出前序遍历和中序遍历前序遍历的顺序是: 根节点 —— 左子树 —— 右子树中序遍历的顺序是: 左子树 —— 根节点 —— 右子树这道题用递归思想(代码中会有详细的解释):通过前序遍历 得到根节点(第一个数)在中序遍历中找到 根节点此时中序遍历的根节点左边就是左子树,右边就是右子树继续递归寻找剩下的。例子:那么此时:9为左子树,20,15,7为右子树右子树还需要继续找该右子树的根节点,思路跟刚开始一原创 2020-10-25 02:30:36 · 172 阅读 · 0 评论 -
Leetcode刷题 week 2
Leetcode刷题 week 2367.有效的完全平方数C++代码Java代码371.两整数之和C++代码Java代码374.猜数字大小C++代码383.赎金信C++代码387.字符串中的第一个唯一字符C++代码Java代码389.找不同C++代码Java代码392.判断子序列C++代码Java代码Leetcode 总题单:https://blog.csdn.net/m0_46272108/article/details/109269407367.有效的完全平方数本体的思想:查找1~num,那么原创 2020-10-26 23:56:31 · 316 阅读 · 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 · 247 阅读 · 1 评论 -
基础算法(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 · 254 阅读 · 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 · 183 阅读 · 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 · 285 阅读 · 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 · 204 阅读 · 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 · 233 阅读 · 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 · 536 阅读 · 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 · 244 阅读 · 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 · 180 阅读 · 0 评论 -
基础算法(2) —— 归并排序模板
归并排序 —— 分治思想确定分界点:mid == l+r >> 1递归排序 ( left —— right)归并:把两个有序的数组合并成一个有序的数组(合二为一)(⭐)双指针算法:首先 a[n] 的最小值和 b[n] 的最小值进行比较,将两者的最小值输出到 new[数组] 当中;假设 a[n] 的最小值 < b[n] 的最小值,则a[n]的最小值输出到new[0]当中,那么下一步,a[n]的指针右移一步,再与b[n]的最小值进行比较,输出二者的最小值;一直到a[n]和b[原创 2020-08-12 16:53:53 · 347 阅读 · 0 评论 -
基础算法(1) —— 快速排序模板
给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 nnn。第二行包含 nnn 个整数(所有整数均在 111~109109109 范围内),表示整个数列。输出格式输出共一行,包含 nnn 个整数,表示排好序的数列。数据范围1≤n≤1000001≤n≤1000001≤n≤100000输入样例:555333 111 222 444 555输出样例:111 222 333 444 5551.快速原创 2020-08-12 13:08:36 · 310 阅读 · 0 评论