ACM/ICPC
文章平均质量分 88
罗博士
这个作者很懒,什么都没留下…
展开
-
树上启发式合并(DSU-on-Tree)
树上启发式合并,用来解决子树查询问题,是一种离线的、“暴力的”算法。从某种角度而言,与莫队算法有些类似,即:按照我们指定的顺序对数据做一个遍历,在遍历过程中记录询问的答案。CF上有一个专门的blog,讲了很多,本文只涉及到有关轻重链剖分的部分。oi-wiki上有一个更短的文章。递归统计子节点的数据先统计轻儿子(统计完的数据即刻清空)最后统计重儿子(统计完的数据保留下来)统计自己的数据(就是再统计一遍轻儿子的数据,加上本节点的数据)原创 2024-06-28 16:13:59 · 688 阅读 · 0 评论 -
蓝桥杯算法赛第4场小白入门赛&强者挑战赛
蓝桥杯算法赛第4场小白&&强者原创 2024-01-31 16:39:34 · 1281 阅读 · 0 评论 -
CDQ分治处理多维偏序基础
CDQ分治处理多维偏序基础多维偏序问题逆序对的两种解法逆序对的分治解法逆序对的树状数组解法二维偏序的解法二维偏序的分治解法二维偏序的树状数组解法三维偏序的解法三维偏序的分治套分治解法CDQ分治是一种离线处理多维偏序问题的算法框架。它不是一个具体的算法,但是为多维偏序问题提供了一个框架结构。以下首先介绍多维偏序问题的CDQ分治框架,从低维到高维;然后介绍几个简单的可以被抽象为多维偏序的修改查询操作的问题。多维偏序问题要想使用CDQ分治解决多维偏序问题,首先还是要从基础的逆序对问题说起,然后再到高维。逆原创 2021-08-24 17:58:15 · 393 阅读 · 0 评论 -
Polya定理与Burnside引理及其应用
Polya定理及其应用群与置换群群与置换群群是近世代数的一个概念,简单的说,群就是集合配运算,如果运算满足:封闭性结合性双元存在(即幺元和逆元)例如:全体偶数集合配上算术加法就构成一个群。而全体偶数集合配上算术乘法就不是一个群。置换群是非常重要的一类群。首先介绍置换,假设有(1,...,n)(1,...,n)(1,...,n)的数,将其变为(a1,...,an)(a_1,...,a_n)(a1,...,an),其中aia_iai只能在[1,n][1,n][1,n]中取值且不重复,这种原创 2021-08-05 11:09:45 · 851 阅读 · 0 评论 -
NEERC 2014 D题 Damage Assessment
NEERC 2014 D题 Damage Assessment题目描述直接计算定积分辛普森方法Romberg方法题目描述这里是NEERC2014的相关资料,包括榜、题目、标程,但是好像没有解题报告。这是CF上的重现Gym100553。当然在ICPC Live Archive上也有,这里是链接,但是好像不能提交了。所以去CF上比较好。牛客网上也有这道题,但是数据与CF上的好像不同,有的代码两边都能过,但有的代码只能过其中一边。数据应该是一样的,也许是SPJ与时限写的不同。如图,一个油罐,两端是球缺原创 2020-11-02 22:26:07 · 355 阅读 · 0 评论 -
定积分的计算与辛普森积分及龙贝格积分
自适应辛普森积分辛普森积分公式辛普森积分公式∫abf(x)dx≈b−a6(f(a)+4f(a+b2)+f(b))\int_a^b{f(x)dx}\approx\frac{b-a}{6}\Bigg(f(a)+4f\big(\frac{a+b}{2}\big)+f(b)\Bigg)∫abf(x)dx≈6b−a(f(a)+4f(2a+b)+f(b))其来源是使用过三点的二次曲线去逼近源曲线,从而得到一个数值结果。...原创 2020-11-02 22:22:06 · 2280 阅读 · 0 评论 -
自动机初步之NFA及ACM中常见的自动机
NFA也是自动机的一种,与DFA对应。对于DFA来说,在指定状态,经过指定字母,会到达唯一确定的状态。对于NFA而言,在指定状态经过指定字母,到达的是一个状态的集合。换种说法,经过某个字母到达的状态不是唯一确定的,候选集合中的状态都存在可能。特别的,NFA存在ϵ{\epsilon}边,即不需任何字母即可从一个状态去往另一个状态。考虑仅由字母{a,b}\{a,b\}构成的字符串。要求字母bb必须连续出原创 2016-08-02 22:09:24 · 3231 阅读 · 3 评论 -
自动机初步之DFA
自动机是一种非常有力的工具,其完备的理论可以参考编译原理或者形式语言与自动机等相关教材。从某种定义角度而言,图灵机也是自动机的一种。这里提到的自动机特指有限状态自动机,简称为FA,根据状态转移的性质又分为确定的自动机(DFA)和非确定的自动机(NFA)。FA的表达能力等价于正规表达式或者正规文法。FA可以看做是一个有向带权图,图的顶点集合称为自动机的状态集合,图的权值集合为自动机的字母集合,图的边代原创 2016-08-02 16:12:36 · 5317 阅读 · 0 评论 -
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 · 589 阅读 · 0 评论 -
根据递推公式构造系数矩阵用于快速幂
简单的例子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 · 5992 阅读 · 2 评论 -
伸展树解决区间问题
伸展树解决区间问题的原理考虑一个序列,从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 · 1466 阅读 · 0 评论 -
伸展树的旋转和伸展操作
伸展树(Splay Tree)是一种排序二叉树,其核心操作是伸展。所谓伸展就是把指定节点旋转至树根(同时保持排序二叉树性质)的过程。而伸展操作的基础就是旋转。 旋转是所有排序二叉树的基本操作,各种平衡二叉树想要维持其平衡性质都离不开旋转。旋转分为左旋和右旋。但实际上,如果指定节点为左儿子,那么它只能右旋;如果指定节点为右儿子,那么它只能左旋。所以如何旋转可以看作是节点本身的一种性质,而非原创 2014-05-08 09:37:39 · 3894 阅读 · 0 评论 -
伸展树的节点的size域的应用
伸展树不是平衡二叉树,但是它的操作均摊是O(logNlogN)的,只需要将增、删、查、改的节点都加以伸展即可。因此可以用来解决相关问题。在伸展树的节点上附加一个size域,用来保存以该节点为根的子树的节点总数。这个size域可以用来解决很多问题。例如可以解决区间问题,例如SBT就是用这个size域来计算平衡条件。size域能够解决的最简单、最直接的问题就是kth问题——求第k小的数。在伸展树上加上s原创 2016-05-30 23:55:14 · 664 阅读 · 1 评论 -
快速傅里叶变换FFT的迭代实现
《快速傅里叶变换的相关定义、原理及其递归算法》描述了y原创 2014-06-18 16:19:27 · 6385 阅读 · 0 评论 -
快速傅里叶变换的相关定义、原理及其递归算法
快速傅里叶变换FFT是离散傅里叶变换DFT的一种快速算法,实际上诸如Matlab等科学计算软件都已经实现了FFT,只需调用相应的接口即可。在ACM里,FFT的典型应用就是大数的乘法或者多项式的乘法。顺便,如果题目规模不是很大,有关大数的运算推荐使用Java语言,使用java.math.BigInteger包完成;包括高精度运算,可以使用BigDecimal包完成。任何情况下,会一门外语总是很重要的原创 2014-06-18 15:15:26 · 11325 阅读 · 3 评论 -
树链剖分之HLD
树链剖分的原理对于数组这样的线性结构,要在其上实现区间查询(和与最值)、区间修改甚至是区间增删都是有办法的。例如Sparse Table算法、树状数组、线段树以及伸展树等。而树是一种非线性结构,为了高效的实现在树上的路径查询、路径修改操作,基本做法是将树按照某种方式剖成若干条链,再将这些链按照顺序组成数组,最后在数组上采用线段树等手段实现操作。 考虑如下一棵树: 可以把它剖成6条链,分别是A原创 2017-01-02 13:51:09 · 2437 阅读 · 0 评论 -
树链剖分HLD解决子树问题
树链剖分HLD可以将非线性的树结构转换为由若干条树链构成的数组,并对数组采用线段树等手段,在一个令人比较满意的时间复杂度内完成树上路径操作,包括路径查询和路径修改。实际上,树链剖分也可以完成子树相关的操作,而且只需稍许改进即可。 考虑这样一个树以及剖分出的树链数组,可以非常明显的看到,任意节点及其子树在数组中均是连续的,而且一定以该节点开头。例如CC子树为CHLNGIMCHLNGIM,BB子树为B原创 2017-01-02 16:21:18 · 1104 阅读 · 0 评论 -
莫队算法
莫队算法是一个非常好的算法。最简单的莫队算法用于解决一类序列上无修改只查询的区间问题。经过不同改进后,还可以解决树上路径查询问题,带修改的区间查询问题……总之,莫队算法可以解决一切区间问题。当然,莫队算法还有一个显著特征——莫队算法是一个离线算法。考虑SPOJ3267,给定一个数组,在数组上进行qq次询问。每次问区间[i,j][i,j]中不同元素的总数有多少。显然暴力法非常容易写,但复杂度绝对不理想原创 2017-01-03 17:03:07 · 2822 阅读 · 1 评论 -
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 · 747 阅读 · 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 · 4641 阅读 · 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 · 1716 阅读 · 0 评论 -
数位DP模板
数位DP问题数位DP指一类问题:给定正整数区间[s, e],问符合条件的数一共有多少个。例如hdu2089以及hdu3555等。 其中,hdu2089的条件为数字中不含4且不含62,hdu3555的条件为数字中包含49。一般而言,这类条件中至少有一个是与整个数的数值无关的,而是与每一位的数字有关。例如上面2道题的条件就与整个数的数值无关。 因此这类问题实际上是数位有关的问题,另一方面,这类问题通原创 2017-08-06 11:21:15 · 1019 阅读 · 0 评论 -
伸展树应用初步——解决区间问题
伸展树的基本操作就是伸展,也就是将指定节点旋转至树根(同时不改变排序二叉树的性质)。在这个操作的基础上,配合节点中保存额外的数据域,伸展树可以完成多种任务,包括各种区间问题。 伸展树的节点除了保存必要的指针信息和键值对之外,经常使用的额外的数据域包括size域、sum域、极值域等等。size域用于记录该节点所代表的子树的节点总数,可以用于解决区间kth数问题;sum域用于记录该节点所代表原创 2014-05-09 21:44:42 · 2628 阅读 · 0 评论 -
FFT的迭代程序实现——hdu1402
《快速傅里叶变换FFT的迭代实现》描述了最简单的FFT的迭代实现,在此基础上可以用它进行原创 2014-06-18 20:15:21 · 1417 阅读 · 0 评论 -
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 · 950 阅读 · 1 评论 -
树的DFS序
树是一种非线性结构,一般而言,我们总是想办法将其转化为线性结构,将树上操作包括子树操作、路径操作等转化为数组上的区间操作,从而在一个较为理想的复杂度内加以解决。将树“拍平”的方法有很多,例如欧拉序、HLD等。实际上欧拉序也是在DFS过程中得到的。不过通常而言,我们所说的DFS序是指:每个节点进出栈的时间序列。 考虑上图中树的DFS序,应为 其中,每个节点均会出现2次,第一次是进入DFS的时刻,第原创 2017-01-04 21:58:55 · 4155 阅读 · 1 评论 -
树上莫队算法
江湖传闻,莫队算法能够解决一切区间查询问题。这样说来,莫队算法也能够解决一切树上路径查询问题,将树上操作转化为DFS序列上的区间操作即可。当然考虑到,树上路径在DFS序列中的性质,还要会求LCALCA。考虑上图中的树,其DFS序为其任意点对aa、bb之间的路径,具有如下性质,令lcalca为aa、bb的最近公共祖先:若lcalca是aa、bb之一,则aa、bb之间的InIn时刻的区间或者OutOu原创 2017-01-05 16:25:58 · 5633 阅读 · 10 评论 -
旋转体的体积和表面积
积分公式令曲线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 · 35584 阅读 · 0 评论 -
最大流的Dinic算法
基于Ford-Fulkerson方法的原始的DFS算法效率是比较低的,因此针对如何尽快的扩流存在一系列的改进算法,例如Dinic算法。Dinic算法的基本思路是:在一次搜索中,在层次间进行扩流,而不是仅对一条路径进行扩流。所谓层次,就是指各节点距离起点的路径长度。当然,每个节点的层次随着残量的变化而变化。Dinic算法的基本流程是:1、根据残量网络计算层次图,使用BFS;2、在层次图上原创 2015-03-27 10:18:10 · 848 阅读 · 0 评论 -
字典树
字典树又称为Trie Tree。Trie来自于单词retrieval。字典树是一种存储、统计和查找大量字符串的数据结构。如下图显示了一个字典树,其中保存了5个单词:how、howl、what、where和when。 字典树显然是一个树型结构,可以认为除根节点外每个节点对应一个字母,也可以认为每条边对应一个字母。实际上,边和节点都不显示的保存字母,而是以子节点的排序表示字母。假设字典树的字母表就是2原创 2015-03-31 06:52:15 · 752 阅读 · 0 评论 -
字符串的最小表示
长度为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 · 1697 阅读 · 0 评论 -
静态RMQ的Sparse Table算法
本文的核心内容包括源代码原创 2014-04-22 08:40:00 · 970 阅读 · 0 评论 -
计算几何初步及基本数据结构
计算几何与解析几何、向量代数等都有一定的关系,用一定的数据结构与算法来处理几何问题。但是计算几何跟数学的解析几何解决问题的首选方法还是有比较大的区别。 计算几何,首先要注意“计算”二字,一定要注意精度问题。在很多题目中,精度设置是直接影响AC还是WA的关键因素。因此,第一,如需要使用浮点数,一般使用double而不用float;第二,浮点数判零的方法,精度最直接体现在这里(工程实践中浮点原创 2014-06-05 21:53:11 · 2063 阅读 · 0 评论 -
POJ3130排序增量法
#include #include using namespace std; double const EPS = 1E-6; #define isZero(x) ( - EPS <= (x) && (x) <= EPS )#define isEq(x,y) isZero( (x) - (y) ) struct point_t{ int x; int y; point_t(原创 2014-04-19 10:31:44 · 629 阅读 · 0 评论 -
指数型母函数求排列程序实现
指数型母函数用来求排列数。它的乘积式以及通项式都会带一个阶乘的倒数。假设{ai}是表示某种排列数的序列,那么母函数应该写作: G(x) = a0 + a1·x + a2·x^2 / 2! + a3·x^3 / 3! + … + an·x^n / n! + …母函数的乘式也是类似的,一般形如: 1 + x + x^2原创 2014-04-19 10:09:41 · 697 阅读 · 0 评论 -
组合型母函数程序实现
母函数或者生成函数是一个神奇的东西,对ACMer来说它省去了排列组合等等规律的考虑,我们只需会列出多项式,会计算多项式乘法,最后选择问题需要的项的系数进行输出即可。至少初级题目可以这样做。 对于任意数列{ai,i=0,1,...,}将其写作 G(x) = a0 + a1·x + a2 · x^2 + a3·x^3 + …原创 2014-04-19 10:01:56 · 846 阅读 · 0 评论 -
容斥原理的迭代程序实现
最简单的容斥原理的表达为 |A∪B| = |A| + |B| - |A∩B|也就是A、B并集的元素个数是A、B元素个数之和再减去A、B交集的元素个数。 扩展到n个集合的并集的一般形式有,|A1∪A2∪…∪An| = Σ|Ai| - Σ|Ai∩Aj|+Σ|Ai∩Aj∩Ak| - … + |A1∩…∩An|×(-1)^(n+1)原创 2014-04-18 10:12:24 · 985 阅读 · 0 评论 -
GJK算法求凸多边形之间的距离
GJK算法最初用来求三维空间中凸多面体的距离(即最近距离),也因此经常用来做碰撞检测(距离是否为0)。后被推广到n维空间中求凸包之间的距离,此处用来求二维平面上2个凸多边形的距离。 GJK算法首先要解决计算Minkowski和的问题。所谓Minkowski和,指A、B两个集合,令A+B={x+y,其中x属于A,y属于B}即二者的Minkowski和。类似的可以定义负集与Minkow...原创 2014-04-18 10:05:14 · 5214 阅读 · 0 评论 -
半平面相交的排序增量法
计算几何与解析几何、向量代数等都有一定的关系,用一定的数据结构与算法来处理几何问题。 计算几何,首先要注意“计算”二字,一定要注意精度问题。在很多题目中,精度设置是直接影响AC还是WA的关键因素。因此,第一,如需要使用浮点数,一般使用double而不用float;第二,浮点数判零的方法,精度最直接体现在这里。double const EPS = 1E-6;#define is0(原创 2014-04-16 20:24:09 · 1803 阅读 · 0 评论 -
最大流的Ford-Fulkerson方法初步
网络或者网络流是一种基本的数据结构,而最大流则是网络流上的基本问题。网络本质上是一个符合一定条件的有向带权图。而最大流是最大可行流的简称,可行流是一个定义在网络流上的符合一定条件的函数。原创 2014-11-17 19:35:10 · 2759 阅读 · 0 评论