算法
嘘……一只bug
逆风的方向更适合飞翔,我不怕千万人阻挡只怕自己投降
——五月天《倔强》
展开
-
线性筛法
看了好多线性筛,把代码整理一下。看之前请先看我在文章中的链接,我写这篇文章的目的主要是我在学习中,对有些不懂地方的注释,以及我的理解。 参考链接 各种线性筛法的前提是知道线性筛素数的原理,具体的原理我贴下这位大佬的博客线性筛素数的原理我是按照每个数都是被他最小的质因子筛去的。 然后是线形筛欧拉函数、约数个数、约数和、乌比莫斯函数。具体讲解传送门 线性筛素数 代码和解释 const int MAX_N=1e6+7; int cnt=0,pri[MAX_N]; bool is_p[MAX_N]; vo.原创 2020-10-12 12:24:46 · 251 阅读 · 1 评论 -
最长上升子序列的两种复杂度解法
动态规划o(N2N^2N2)的解法 我们先确定状态: dp[k]:表示以aka_kak为终点的最长上升子序列的长度。可以看到,该状态满足无后效性 然后确定递推式 初始状态:maxLen(1)=1 maxLen(k)=max {maxLen(i):1<=i<k,ai<aka_i<a_kai<ak,且k!=1}+1 如果找不到这样的i,那么有maxLen(k)=1 代码 #include<bits/stdc++.h> using namespace std.原创 2020-09-14 22:19:52 · 413 阅读 · 0 评论 -
Distinct Substrings(后缀数组)
题意 求一个字符串的不同子串数量 思路 该字符串的所有后缀子串的前缀子串即为改字符串的所有子串数量。总的子串数量=len*(len+1)/2,那么重复的子串如何求呢?即为height数组的总和,对排名相邻两个的后缀,他们的重复前缀的前缀都是重复的,raokou~ 如排名为1,2的后缀子串 1 a a a a b 2 a a a b 最长公共前缀的长度是3 该公共前缀的前缀a a a a a a在1 2 中重复出现,故减去 #pragma GCC optimize(2) #includ原创 2020-07-29 21:51:51 · 343 阅读 · 0 评论 -
POJ Milk Patterns(后缀数组和二分)
这个题和昨天写的Musical Theme基本一样,那篇博客有后缀数组的学习,如果那个题没有写过的话,搞完了这个题可以去做一下。 题意 显然就是求最长可重复子串的长度,但是该子串重复的次数需不小于K。 思路 先求后缀树组,而后利用后缀树组求height数组(height[i]:存储排名为i和i-1的后缀子串的最长重复前缀子串长度 )。把排序后的后缀分成若干组,其中每组的后缀之间的height值都不小于k。例如,字符串为“aabaaaab”,当k=2时,后缀分成了4组如图所示 可以想到当一组内的height都原创 2020-07-29 10:25:12 · 122 阅读 · 0 评论 -
POJ 1743 Musical Theme(后缀数组学习+该题解法)
题意:有N个音符组成的一首乐曲,每个音符是一个1~88的整数,现在要找一个最长的主题,即是该音符序列的一个子串,主题还要满足以下三个条件: 1.最少由五个音符组成2.该主题在乐曲中出现最少两次(两个主题不一定要一模一样,只要一个可以由另个一转置得到即视为同一种主题,转置:主题序列中的每一个字符都被加上或者减去了同一个数字)3.每两个主题不可有重叠的部分 如果没有装置这个要求的话,很显然是求不可重叠最长重复子串,用后缀数组就可以做,但是我们观察转置的定义,经过一些处理可以将题目化为不可重复最长重复子串。假设一原创 2020-07-28 22:10:33 · 259 阅读 · 0 评论 -
使用Python的cyaron造数据
使用洛谷的cyaron项目 介绍 在github上的项目地址链接 使用下面的代码造了三组a+b的数据 import cyaron import numpy for i in range(1,4): test_data = cyaron.IO(file_prefix="D:\setproblem\data",data_id=i,input_suffix=".in", output_suffix=".out") #路径之中不要包含其他字符,只包含英文字母 a=numpy.random.ran原创 2020-07-11 16:25:25 · 1255 阅读 · 0 评论 -
网络流学习
昨天学习了网络流,可算弄明白了。把学习过程中看的博客和视频贴一下,大佬们讲的很好了,我就不写了赖得写了 先看基本概念:博客链接这篇文章讲的很好,也讲了许多求最大流的算法,其中最好理解的是EK算法,但是效率不高,Dicnic算法是其改进版,也是竞赛经常用到的算法 如果看完文章之后EK和Dicnic算法没看懂的话,我再贴两个讲解这两个算法的视频 EK:视频链接 Dicnic:1.视频链接2.视频链接 看完这些博客和视频我想你已经弄懂了 写一个板子题练一下板子题HDU Drainage Ditches EK算原创 2020-07-11 08:17:51 · 214 阅读 · 0 评论 -
sort和qsort的使用
sort和qsort的使用转载来源 好像sort函数不可以对指针数组排序,而qsort可以 qsort函数的具体使用:转载来源转载 2020-06-14 12:42:17 · 122 阅读 · 0 评论 -
树状数组的实现和应用
之前也看了不少相关的博客,但是都没咋弄明白,十篇文章不如一张图,十张图不如一段视频,在小破站看到了一段视频,才真正搞明白视频连接 单点修改,区间查询 void add(int x,int k){//单点修改 for(;x<=N;x+=(x&-x)) t[x]+=k; return ; } int ask(int x){//区间查询 int ans=0; for(;x;x-=(x&-x)) ans+=t[x]; return ans; } //add(x,k) //ask(原创 2020-05-11 10:26:06 · 115 阅读 · 0 评论 -
HDU Cotree(换根dp,树的重心)
我是看了这位大佬的博客,感谢大佬他的博客 题目描述:有两颗树,需要在这两棵树之间添加一条边,这样就变成了一棵树,求这棵树任意两点之间的最小距离和 即$$\sum ^{N}{i=1}\sum ^{N}{j=i+1}dis\left( i,j\right)$$ 解题思路:首先考虑,我们要在哪两个点之间添加一条边呢?这个点实际上就是树的重心,树的重心是这样定义的:树的重心也叫树的质心。找到一个点,其所有...原创 2019-11-14 12:28:45 · 208 阅读 · 0 评论 -
有向图求最小环
1 先用拓扑排序将多余的顶点去除,只剩下组成环的点,然后用DFS求出每个环的长度 #pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; #define pi acos(-1.0) #define e exp(1.0) typedef long long ll; const ll maxn=2e5+7...原创 2019-11-09 22:51:19 · 353 阅读 · 0 评论 -
Floyd算法计算最短路并记录路径
1计算最短路有弗洛伊德和迪杰斯塔拉两种算法,前可以计算出任意两个顶点之间的最短路径,后用于计算特定两个顶点之间的最短路径,Floyd算法用于计算无向或者有向图加权图(不包括长度为负的回路)的完全最短路径 2Floyd算法的构造过程和Warshall算法非常相似,通过初试的权重矩阵,每次加入一个顶点,看这个顶点能否作为中间点来更新图的权重矩阵(以这个点为桥梁,判断是否缩短了原先两点的距离,即Map[...原创 2019-11-09 15:17:28 · 3052 阅读 · 0 评论 -
Warshall算法求有向图的传递闭包
1定义是这样给出的,传递闭包:对于任何关系 R,R 的传递闭包总是存在的。传递关系的任何家族的交集也是传递的。进一步的,至少存在一个包含 R 的传递关系,也就是平凡的: X × X。R 传递闭包给出自包含 R 的所有传递关系的交集……其实就是求点与点之间的可达关系,比如1–>4,4–>6,那么1–>6,用warshall算法可以求出有向图的传递闭包 #pragma GCC opt...原创 2019-11-09 12:23:39 · 918 阅读 · 0 评论