自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)

原创 树状数组与前缀和差分数组以及二维树状数组

树状数组与前缀和差分数组以及二维树状数组树状数组基本思想树状数组基本思想树状数组有称作Binary Index Tree,顾名思义,就是一种以二进制为索引的数据结构。另源数组记作AAA。考虑需要求取Σ\SigmaΣ...

2020-03-13 11:19:41 173

原创 POJ2528线段树区间合并加离散化

POJ2528Mayor’s posters就只支持一种操作,一次性的给一段区间涂上颜色,且每次颜色均不一样。问最后一共可以看到多少种颜色。关于线段树的更详细实现请参考线段树解决区间问题包括延迟操作以及离散化/* 在数轴上,一次给一个线段涂上颜色 后面的颜色会覆盖前面的颜色 问最后能看到多少个颜色 显然是成段更新,线段树 区间范围是1千万,需要离散化...

2020-03-10 20:22:28 57

原创 POJ3667线段树区间合并

POJ3667Hotel要求支持两种操作:成段分配与成段回收。/* 1 a:找一段空间有连续a个空,分配出去 2 a b: 从a开始的b个位置回收*/#include <stdio.h>int const SIZE = 50010;//ST[t]表示t节点中最长的可用空间int ST[SIZE<<2];//Start[t]表示最长可用空间的...

2020-03-10 19:51:49 52

原创 hdu4578线段树多种延迟标记

hdu4578Transformation,要求支持3种修改操作与3种查询操作。/* 数组A[1...N],一共有4种操作 1 x y c:A[x...y]增加c 2 x y c:A[x...y]乘以c 3 x y c:A[x...y]全都变成c 4 x y p:求SIGMA(Ai^p) x<=i<=y,1<=p<=3 建...

2020-03-10 19:48:00 67

原创 线段树解决区间问题包括延迟操作以及离散化

线段树解决区间问题包括延迟操作以及离散化线段树简介与分治策略线段树简介分治策略线段树不能解决的问题线段树的基本操作线段树的简单示例线段树的基础代码实现辅助操作建树查询修改延迟操作延迟操作思想延迟操作代码实现线段树简介与分治策略线段树简介线段树是一棵二叉树,用来解决区间问题。线段树的每个节点均保存有源数组中某个区间的特征值(最值、区间和、……)。本质上说,线段树是区间问题分治策略的实现模板。...

2020-03-08 13:45:36 119

原创 多边形与圆相交求面积题目POJ2986&&hdu2892

多边形与圆相交求面积题目POJ2986&&hdu2892POJ2986hdu2892具体思路可以参考简单多边形与圆相交求面积POJ2986/** 三角形与圆相交求面积*/#include <stdio.h>#include <math.h>using namespace std;double const PI = acos(-1.0...

2019-12-24 16:37:36 49

原创 简单多边形与圆相交求面积

简单多边形与圆相交求面积简单多边形的有向面积简单多边形与圆相交的有向面积圆心三角形与圆相交求面积简单多边形的有向面积所谓简单多边形,就是指不相邻的边不相交,且每个顶点只跟2条边相邻。一般而言,除非题目要求判断是否为简单多边形,否则给出的数据肯定都是简单多边形。以下将简单多边形简称为多边形。多边形一般都是以点集的形式给出,顺时针或者逆时针。另外一个需要注意的概念就是多边形的凹凸性。一般而言,凸多...

2019-12-24 16:32:40 110 5

原创 莫比乌斯反演入门题目

莫比乌斯反演入门题目整除分块[洛谷P2568: GCD](https://www.luogu.org/problem/P2568)[SPOJ VLATTICE](https://www.spoj.com/problems/VLATTICE/en/)[hdu1695: GCD](http://acm.hdu.edu.cn/showproblem.php?pid=1695)[BZOJ 2005: 能量...

2019-11-07 15:43:39 70

原创 狄利克雷卷积与莫比乌斯函数

狄利克雷卷积与莫比乌斯函数数论函数狄利克雷卷积莫比乌斯函数若想使用莫比乌斯反演,则熟练掌握狄利克雷卷积包括定义、记号以及相关的性质、证明等是非常有好处的。数论函数数论函数也称作算术函数,就是定义在正整数上的函数,也可看作是一个数列。例如:f(n)=2n−1f(n)=2n-1f(n)=2n−1就表示了一个数论函数,其实就是:[1,3,5,7,9,...][1,3,5,7,9,...][1...

2019-11-05 15:43:18 121

原创 POJ2891

求解线性同余方程组,模数可能不两两互质,因此需要使用合并方程的方法。#include <stdio.h>typedef long long int llt;//The extended Euclidean algorithm implemented by iteration//returns gcd(a,b), and x, y are satisfied with ax...

2018-07-06 13:18:16 458 2

原创 中国剩余定理与线性同余方程组求解

线性同余方程组中国剩余定理线性同余方程组实际上一元一次线性同余方程组,形式如下: ⎧⎩⎨x≡r0(modm0)x≡r1(modm1)⋯{x≡r0(modm0)x≡r1(modm1)⋯\begin{cases}x\equiv{r_0}({\rm{mod}}\,m_0) \\x\equiv{r_1}({\rm{mod}}\,m_1) \\\cdots\end{ca...

2018-07-06 13:06:56 1875 2

原创 欧几里德算法与扩展的欧几里德算法及乘法逆元

欧几里德算法扩展的欧几里德算法数学公式欧几里德算法欧几里德算法用于求解最大公倍数,也就是辗转相除法。其结论非常简洁,对任意整数aaa、bbb,有: gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b) 其中,%代表取模运算,也就是C++语言中的运算符。因此,欧几里德算法实现起来也非常简单。...

2018-07-05 23:25:10 1079

原创 数位DP模板

数位DP问题数位DP指一类问题:给定正整数区间[s, e],问符合条件的数一共有多少个。例如hdu2089以及hdu3555等。 其中,hdu2089的条件为数字中不含4且不含62,hdu3555的条件为数字中包含49。一般而言,这类条件中至少有一个是与整个数的数值无关的,而是与每一位的数字有关。例如上面2道题的条件就与整个数的数值无关。 因此这类问题实际上是数位有关的问题,另一方面,这类问题通

2017-08-06 11:21:15 576

原创 hdu5953 三维空间旋转

题目大意给定若干个3×33\times3的旋转矩阵,对每个矩阵求一个到其他矩阵的最短距离。 两个旋转矩阵的距离做如下定义:对单位球上的任意点PP,经过第一个旋转矩阵的旋转后得到的点为P1P_1,经过第二个旋转矩阵的旋转得到的点为P2P_2,则P1P_1和P2P_2在单位球上有一个距离。对单位球上所有的点PP,P1P_1和P2P_2的最大距离称为两个旋转矩阵之间的距离。思路将第一个旋转记作R1R_1

2017-02-09 13:19:38 742 1

原创 树上莫队算法

江湖传闻,莫队算法能够解决一切区间查询问题。这样说来,莫队算法也能够解决一切树上路径查询问题,将树上操作转化为DFS序列上的区间操作即可。当然考虑到,树上路径在DFS序列中的性质,还要会求LCALCA。考虑上图中的树,其DFS序为其任意点对aa、bb之间的路径,具有如下性质,令lcalca为aa、bb的最近公共祖先:若lcalca是aa、bb之一,则aa、bb之间的InIn时刻的区间或者OutOu

2017-01-05 16:25:58 3061 10

原创 树的DFS序

树是一种非线性结构,一般而言,我们总是想办法将其转化为线性结构,将树上操作包括子树操作、路径操作等转化为数组上的区间操作,从而在一个较为理想的复杂度内加以解决。将树“拍平”的方法有很多,例如欧拉序、HLD等。实际上欧拉序也是在DFS过程中得到的。不过通常而言,我们所说的DFS序是指:每个节点进出栈的时间序列。 考虑上图中树的DFS序,应为 其中,每个节点均会出现2次,第一次是进入DFS的时刻,第

2017-01-04 21:58:55 3140 1

原创 莫队算法

莫队算法是一个非常好的算法。最简单的莫队算法用于解决一类序列上无修改只查询的区间问题。经过不同改进后,还可以解决树上路径查询问题,带修改的区间查询问题……总之,莫队算法可以解决一切区间问题。当然,莫队算法还有一个显著特征——莫队算法是一个离线算法。考虑SPOJ3267,给定一个数组,在数组上进行qq次询问。每次问区间[i,j][i,j]中不同元素的总数有多少。显然暴力法非常容易写,但复杂度绝对不理想

2017-01-03 17:03:07 720 1

原创 树链剖分HLD解决子树问题

树链剖分HLD可以将非线性的树结构转换为由若干条树链构成的数组,并对数组采用线段树等手段,在一个令人比较满意的时间复杂度内完成树上路径操作,包括路径查询和路径修改。实际上,树链剖分也可以完成子树相关的操作,而且只需稍许改进即可。 考虑这样一个树以及剖分出的树链数组,可以非常明显的看到,任意节点及其子树在数组中均是连续的,而且一定以该节点开头。例如CC子树为CHLNGIMCHLNGIM,BB子树为B

2017-01-02 16:21:18 823

原创 树链剖分之HLD

树链剖分的原理对于数组这样的线性结构,要在其上实现区间查询(和与最值)、区间修改甚至是区间增删都是有办法的。例如Sparse Table算法、树状数组、线段树以及伸展树等。而树是一种非线性结构,为了高效的实现在树上的路径查询、路径修改操作,基本做法是将树按照某种方式剖成若干条链,再将这些链按照顺序组成数组,最后在数组上采用线段树等手段实现操作。 考虑如下一棵树: 可以把它剖成6条链,分别是A

2017-01-02 13:51:09 1176

原创 hdu3483——利用递推公式得到系数矩阵再进行快速幂

系数矩阵的推导过程请看《根据递推公式构造系数矩阵用于快速幂》。import java.util.Scanner;public class Main{ static long [][] C = new long [51][51];//Pascal's triangle static Matrix [] Matrices = new Matrix[51]; public sta

2016-08-16 22:13:33 465

原创 根据递推公式构造系数矩阵用于快速幂

简单的例子FibonacciFibonacci数列考虑FibonacciFibonacci数列, F(n)=F(n−1)+F(n−2)F(n)=F(n-1)+F(n-2) 将右边两项看做是一个列向量的形式,令 Xn−1={Fn−1Fn−2}X_{n-1}=\left\{\begin{matrix}F_{n-1}\\F_{n-2}\end{matrix}\right\} 很容易得到XnX_n的

2016-08-16 21:51:59 3860

原创 自动机初步之NFA及ACM中常见的自动机

NFA也是自动机的一种,与DFA对应。对于DFA来说,在指定状态,经过指定字母,会到达唯一确定的状态。对于NFA而言,在指定状态经过指定字母,到达的是一个状态的集合。换种说法,经过某个字母到达的状态不是唯一确定的,候选集合中的状态都存在可能。特别的,NFA存在ϵ{\epsilon}边,即不需任何字母即可从一个状态去往另一个状态。考虑仅由字母{a,b}\{a,b\}构成的字符串。要求字母bb必须连续出

2016-08-02 22:09:24 2349

原创 自动机初步之DFA

自动机是一种非常有力的工具,其完备的理论可以参考编译原理或者形式语言与自动机等相关教材。从某种定义角度而言,图灵机也是自动机的一种。这里提到的自动机特指有限状态自动机,简称为FA,根据状态转移的性质又分为确定的自动机(DFA)和非确定的自动机(NFA)。FA的表达能力等价于正规表达式或者正规文法。FA可以看做是一个有向带权图,图的顶点集合称为自动机的状态集合,图的权值集合为自动机的字母集合,图的边代

2016-08-02 16:12:36 3888

原创 伸展树解决区间问题

伸展树解决区间问题的原理考虑一个序列,从1开始编号,记作A[1...N]A[1...N],在其上实施一些区间操作。例如,将[s,e][s, e]中的数都增加一个deltadelta,查询[s,e][s, e]的所有数的和或者极值,甚至将[s,e][s, e]区间从原序列中删除(之后的数依次前移),将新的数插入到原序列中指定的位置(该位置及其以后的数依次后移)。这个时候,以原序列中的下标为键

2016-06-04 12:18:14 1229

原创 伸展树的节点的size域的应用

伸展树不是平衡二叉树,但是它的操作均摊是O(logNlogN)的,只需要将增、删、查、改的节点都加以伸展即可。因此可以用来解决相关问题。在伸展树的节点上附加一个size域,用来保存以该节点为根的子树的节点总数。这个size域可以用来解决很多问题。例如可以解决区间问题,例如SBT就是用这个size域来计算平衡条件。size域能够解决的最简单、最直接的问题就是kth问题——求第k小的数。在伸展树上加上s

2016-05-30 23:55:14 520

原创 旋转体的体积和表面积

积分公式令曲线y=f(x)y=f(x)绕xx轴旋转,形成的旋转体,则其体积和表面积可以计算积分而得(假设体积和表面积一定存在,积分一定存在,这里不讨论数学问题)。 体积公式为: V=∫πy2dxV={\int}{\pi}{y^2}dx 表面积公式为 S=∫2πy1+y′2−−−−−−√dxS=\int{2\pi}{y}\sqrt{1+{y^{\prime}}^2}dx 剩下的就是推导

2015-09-18 23:01:26 9269

原创 POJ1528——因子和

因子和可以参考这里,虽然这道题数据很弱,可以暴力过。但是可以用来练习。注意输入为1时的情况。暴力法#include <cstdio>int proc(int n){ int s = 1; for(int i=2;i<n;++i){ if ( 0 == n % i ) s += i; } return s;}int main(){ printf

2015-09-10 23:13:23 432

原创 POJ1845——A的B次方的因子和

算术基本定理根据算术基本定理,任何一个大于1的自然数n,能够唯一表示为 n=∏ipirin=\prod_i{p_i}^{r_i} 其中,pip_i是n的第ii个质因子。一般将质因子按升序排列,则上述表示形式是唯一的。例如:12=22×3112=2^2\times3^1因子个数nn的所有的因子的个数为: ∏i(1+ri)\prod_i(1+r_i) 例如12的因子个数为(2+1)×(1+1)=

2015-09-10 22:37:30 545

原创 Pollard-Rho方法分解整数因子

对于大整数而言,要找出其因子是比较困难的,事实上仍然没有很好的解决方法。不过在ACM里面有几种“标准的”方法可以使用,例如Pollard-Rho方法。 假设题目是求nn的因子,Pollard-Rho方法的基本思想是任意给定整数yy和xx,求gcd(y−x,n)gcd(y-x,n)。注意,所有运算都是在模nn的条件下进行的。如果gcd≠1且gcd≠ngcd\neq1且gcd\neq{n},则gcdg

2015-09-10 10:52:28 3061 1

原创 大素数测试的Miller-Rabin算法

Miller-Rabin算法本质上是一种概率算法,存在误判的可能性,但是出错的概率非常小。存在严格的理论推导。费尔马小定理如果pp是质数且(a,p)=1(a,p)=1,则有ap−1≡1(modp)a^{p-1}\equiv1({\rm mod}\,{p})。 当然反过来不一定成立。即当ap−1%p=1a^{p-1}{\%}{p}=1时,pp未必是质数。但是这个概率比较小。所以利用费

2015-09-08 15:50:06 3559 3

原创 SPOJ694 && SPOJ705 ——不同子串的总数

题意:给定字符串S,求S的不同子串的总数量。求出SA数组与Height数组,每个子串必然是某个后缀的前缀。令S的长度为N,则后缀SA[i]可以贡献出N-SA[i]个前缀。但其中有Height[i]个与之前的是重复的,因此要减去。另外,在套模板的时候,处理的字符串S实际上比源字符串多一个结束标记,因此计算出的不同子串数量比答案要多N(N为S的长度,非源的长度,实际上就是源长度加1)。SPOJ694//

2015-04-11 22:53:37 1068

原创 POJ3261——重复K次的子串

题意:给定长度为N的整数串,问至少重复K次的子串最长是多少,重复子串之间可以重迭。求出SA与Height数组,首先将问题转为判定性问题,即:给定长度L,问存不存在长度为L且重复K次的子串。然后二分搜索最大的可能的L即可。存在长度为L且重复K次的子串等价于:Height数组中存在一个长度至少为K-1的区间[i,j],Height[i,j]的值全部都不小于L。另外源数组中的元素取值范围在百万之间,使用基

2015-04-11 22:35:22 744

原创 POJ1743——不可重迭的最长重复子串

题意:给定一系列的整数作为音阶,旋律为相邻音阶之差。问最长的主旋律是多长,主旋律需满足3个条件: 1. 长度至少为5; 2. 至少重复出现2次; 3. 主旋律各不重迭。对源进行变换以后,就是问不重迭的最长重复子串是多长。求出SA数组与Height数组以后。 首先将问题改为判定性问题,即给定长度L,问是否存在L长度的不重迭重复子串。其等价于在Height数组中找到一个区间[i,j],He

2015-04-11 22:32:41 393

原创 后缀数组

给定一个长度为N的字符串S,令Si为从第i个位置开始的S的后缀,i称为后缀Si的序号,i取值范围从0到N-1。显然S有N个后缀。将这N个后缀按字典序升序排列,并用一个数组记录其后缀序号,则该数组称为后缀数组。令S=adbc,则S共有4个后缀,分别为 S0=adbc S1=dbc S2=bc S3=c 其字典序升序是S0、S2、S3、S1,所以字符串S的后缀数组是 SA[] = {0, 2

2015-04-10 23:20:31 803

原创 字符串的最小表示

长度为n的字符串s,其字母序列表示为[0,1,2,…,n-1]。将其循环左移一位变为[1,2,…,n-1,0],记作s(1)。则s(k+1)为s(k)循环左移一位得到。s(0)就是s。一共可以得到n个字符串的集合,{s(0),s(1),…,s(n-1)},称为s的循环同构集合,n个字符串中字典序最小的那个称为集合的最小表示,也称为s的最小表示。如果字符串a、b属于同一个循环同构集合,则说二者是循环同

2015-03-31 17:39:47 1164

原创 AC自动机

在字典树上加上失配链(也可以叫做失败指针)就可以构成AC自动机,可以用来解决多模式匹配的问题。给定多个模式串P0、P1、……,给定目标串T,问T中包含了哪些P……等等问题。 在AC自动机中,每一个节点都有一个失败指针指向自动机中的另外一个节点;除了根节点,根节点的失败指针指向NULL。假设节点A的失败指针指向节点B,说明节点A的向上的字符串与从根到B的字符串匹配,而且匹配长度是最长的。 如下的A

2015-03-31 13:19:17 679

原创 字典树

字典树又称为Trie Tree。Trie来自于单词retrieval。字典树是一种存储、统计和查找大量字符串的数据结构。如下图显示了一个字典树,其中保存了5个单词:how、howl、what、where和when。 字典树显然是一个树型结构,可以认为除根节点外每个节点对应一个字母,也可以认为每条边对应一个字母。实际上,边和节点都不显示的保存字母,而是以子节点的排序表示字母。假设字典树的字母表就是2

2015-03-31 06:52:15 608

原创 字符串的特征向量与KMP算法

字符串的特征向量就是由字符串各位置上的特征数构成的一个向量。设字符串为P,令Pi为从字符串首字母到第i个位置的前缀,则字符串P的i位置上的特征数就是Pi的首尾非空真子串匹配的最大长度。例如:字符串abcdaabcab的特征向量是(0,0,0,0,1,1,2,3,1,2)。其中第5个位置的特征数是1,因为P5是abcdaa,首尾非空真子串能够匹配的就是a;而第7个位置的特征数是3,因为P7是abcda

2015-03-30 16:33:16 5369 5

原创 最大流的Dinic算法

基于Ford-Fulkerson方法的原始的DFS算法效率是比较低的,因此针对如何尽快的扩流存在一系列的改进算法,例如Dinic算法。Dinic算法的基本思路是:在一次搜索中,在层次间进行扩流,而不是仅对一条路径进行扩流。所谓层次,就是指各节点距离起点的路径长度。当然,每个节点的层次随着残量的变化而变化。Dinic算法的基本流程是:1、根据残量网络计算层次图,使用BFS;2、在层次图上

2015-03-27 10:18:10 668

原创 最大流的Ford-Fulkerson方法初步

网络或者网络流是一种基本的数据结构,而最大流则是网络流上的基本问题。网络本质上是一个符合一定条件的有向带权图。而最大流是最大可行流的简称,可行流是一个定义在网络流上的符合一定条件的函数。

2014-11-17 19:35:10 1823

空空如也

空空如也

空空如也
提示
确定要删除当前文章?
取消 删除