数据结构进阶
文章平均质量分 55
7_26
我很勤劳,还没有添加简介
展开
-
SIMULATE ANNEAL
模拟退火想不出来别的做法的时候,亦或是函数特征比较明显的时候,具体一点,就是很明显的能看出来他是个函数,且在规定范围内有极值的时候可以使用模拟退火。AcWing3167费马点是吧,直接随机化把你草出屎来;#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<ctime>#define x first#define y second原创 2022-01-26 15:04:54 · 656 阅读 · 0 评论 -
静态仙人掌
仙人掌,一个一听就很屌的东西,其实真正做了做之后,发现也没有想象的那么难过天际,无非就是多个算法拼凑在一起罢了;Acwing2866嗦点,lca,做完了,主要是代码不好写,真正把代码写出来之后发现也还可以,代码没有想象的那么难;#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int N = 12010, M = N * 3;int n ,m , Q原创 2022-01-26 13:40:47 · 678 阅读 · 0 评论 -
再学点分治
原创 2022-01-25 09:30:43 · 272 阅读 · 0 评论 -
CDQ分治
所谓CDQ分治,经常用来解决三维偏序问题;三维偏序题目初始形式,我们发现里面东西给出来的顺序是没有实际意义的;那么让a来充当这一维顶替无效信息;然后对剩下两个维度进行处理;对于二维偏序问题,我们使用那个啥树状数组,先给一维排好序,另一维使用树状数组,但是对于三维偏序问题,我们的bc维度是混乱的,那么考虑先排序,因为a已经定好了不能乱动,而我们又要搞bc,那么考虑先分段,即先定下a的大致大小,再对b精确排序,再用树状数组统计c,然后就出来了;#include<iostream>#inc原创 2022-01-04 21:11:26 · 196 阅读 · 0 评论 -
左 偏 树
用来维护堆的集合;为什么不能直接暴力,因为这样子会退化成是一条链,然后就报废了;那么如果我们要及时完成合并,就需要平衡;两种方法,第一种是随机数,第二种是通过一些奇怪的方法维护平衡的性质;、左偏树,因为他总是能保证树的一边,也就是右边是平衡的;这要得益于他设计出来的dist性质以及,左偏性质的结合,使得链只有可能出现在右边,然后我们就方便干事情了;合并的时候维护左偏性质就可以了;#include<iostream>#include<cstdio>using names原创 2021-12-30 21:10:04 · 494 阅读 · 0 评论 -
SPLAY
P3391文艺平衡树,反转区间;splay能够翻转区间,是因为他贼能转,转出一个子树的中序遍历就代表一个区间。首先我们把区间给转上来,就是转上那两个 l−1l - 1l−1 和 r+1r + 1r+1 两个端点,然后中间形成的子树就是那个区间了,但是不能去转别的端点,如 lll rrr , 因为这样子的话你不能确定一个子树出来代表一个区间;然后就是翻转,翻转的话,我们发现只要将每个节点的儿子翻转一下就可以了,但是我们不给出证明了,因为比较简单,但是如果你都翻转的话复杂度会假掉,以及转了两次等于没有原创 2021-12-25 21:15:19 · 563 阅读 · 0 评论 -
【数据结构】蓝警:合众国之辉
《命令与征服:蓝色警戒》(Command & Conquer:Blue Alert)是Eastwood及EA开发,苏联艺电游戏公司发行的一款即时战略(RTS)单机游戏。其续作有《命令与征服:蓝色警戒2》及《命令与征服:蓝色警戒3》。在游戏中,玩家需要通过操纵各式游戏单位,以摧毁对方阵地为目标,来争取胜利;游戏中,美军在沙特的一个小岛上修建了一个基地,基地里面有各种各样的管道和和石油开采井,每条管道都是东西分布,而且都是从距离基地东边缘l米处一直延伸到距离东边缘r米处,包括两个端点;每个开采井位于原创 2021-09-21 14:03:13 · 151 阅读 · 0 评论 -
维护区间加k阶多项式序列
第一种是很朴素的想法,但是绝对超时还不如暴力,就是牛莱公式积分积一下然后tag变为那个二阶等差的关键参数,但是关键参数只能记录常数个,因此这个方法每次都要pushdown所以叉掉了;然后第二种是二阶差分,如果我们加上0次的序列那么直接一阶差分单点修改,如果加上一次序列直接二阶差分单点修改,加上二次的序列直接三阶差分单点修改,其实也可以二阶差分区间修改反正都是log,无非是你吃饱了撑不撑的问题,因此我们得出结论n阶多项式序列直接采用n阶差分区间修改或者是n+1阶差分单点修改,求一次前缀和差分降一阶;手造数原创 2021-09-19 20:50:35 · 223 阅读 · 0 评论 -
lowbit 线段树
特点是进行lowbit运算,有个特点,原来都是没有规律的,进行log次左右之后就会有规律原创 2021-08-27 13:21:09 · 210 阅读 · 0 评论 -
再谈扫描线
其实两个多月之前写过一篇,但是那时候的水平怎么能和现在相比,恰好前几天鸽了一道扫描线的题,所以今天来补上;POJ2482POJ1151前面一个是数星星,后面一个是亚特兰蒂斯,两题其实都是属于扫描线的一个模板题啊,数星星那个属于是找最大值的版本,亚特兰蒂斯那个属于是找和的版本;扫描线其实就是一个平面上有一些线,无非你要求出关于这些线的一个信息罢了。你先定下一个坐标表示你当前的一个线段树的一个含义,然后把另一个维度当成是时间轴,你就根据另一个维度去操作就好了;首先如果说那些点的横纵坐标的值域都是不需原创 2021-08-10 15:13:17 · 114 阅读 · 1 评论 -
点 分 治
POJ 1741做到这题就像怎么做,想了半个小时网上搜下思路,发现是点分治板子题了属于是;点分治,是在一棵树上的处理方法,处理什么问题我也不知道,主要步骤如下:1.找重心;2.统计合法方案;3.递归找接下来的方案;方案分成三类:1.穿过重心的;2.圈地自萌的;3.停在重心的,需要去特判一下;不同的点分治题目其区别在于统计的时候方法不同;AcWing 252就是板子题,直接上代码看下了;首先这份代码看起来十分舒服,因为好几块内容分装了,函数拆的很好;#include<iost原创 2021-07-30 14:26:31 · 116 阅读 · 2 评论 -
树上差分 与 树链剖分
树上差分就是说;其实树上的问题真的和线性的问题是很像的只不过是迭代方式发生了一个变化;线性的前缀和:前缀和;线性的差分:差分;线性的这两个东西的结合:线段树;在树上就分别是:开一个数组表示这个节点的子树上的权值之和;树上差分;树链剖分;第一个树上面的前缀和就不讲了,很简单;来个树上差分;首先我们要知道树上差分维护的是一条边的值;倞阶指南上面有两幅图画的好;每次求边的值的时候会把大半棵树遍历一遍;在那条边的两个节点上打上+1的标记然后在LCA上打上-2的标记;代码int dfs原创 2021-07-10 17:41:42 · 376 阅读 · 2 评论 -
BST & TREAP
首先来个名字的解读;TREAP == TREE + HEAP;TREE不是普通的TREE而是BST;BST给定你一颗二叉树,树上的每个节点都带有一个数值,成为节点的关键码,也就是后面的key;BST有两个性质,第一个性质就是左子树的所有节点的key都要小于等于该节点,第二个性质就是右子树的所有节点key都要大于等于该节点,满足上述性质的二叉树就是一颗二叉查找树BST;#include<iostream>#include<cstdio>using namespace st原创 2021-07-06 09:26:59 · 151 阅读 · 1 评论 -
【线段树|数论】P1471
还是Y总讲得好;线段树里面的东西一定要满足结合律;首先看下这题目要给我们求的东西是平均数和方差;那么在草稿纸上排下草稿,用数列中常见的信息比如区间长度,平均数,sum,这几个参数去看看怎么合并两个区间;推出来了就套上板子就可以了;就是线段树这个毒瘤特别难写;参数符号不要打错,输入输出时候%lld %lf不要打错;每次每个操作需要更新的参数最好列出来;struct里面存够转移时所需要的信息;代码#include<iostream>#include<cstdio>原创 2021-07-01 11:24:48 · 146 阅读 · 4 评论 -
树状数组例题2AcWing243
一个简单的整数问题2给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问数列中第 l∼r 个数的和。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案占一行。数据范围1≤N,M≤105,|d|≤1000原创 2021-05-27 12:49:05 · 154 阅读 · 1 评论 -
线段树例题6AcWing1277
维护序列老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。有长为 N 的数列,不妨设为 a1,a2,…,aN。有如下三种操作形式:把数列中的一段数全部乘一个值;把数列中的一段数全部加一个值;询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模 P 的值。输入格式第一行两个整数 N 和 P;第二行含有 N 个非负整数,从左到右依次为 a1,a2,…,aN;第三行有一个整数 M,表示操作总数;从第四行开始每行描述一个操作,输入的操作有以下三种形式:操作 1:1 t g转载 2021-05-27 10:03:05 · 151 阅读 · 1 评论 -
【扫描线法|线段树例题5】AcWing247
有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述。其中一些甚至包括岛屿部分地图。但不幸的是,这些地图描述了亚特兰蒂斯的不同区域。您的朋友 Bill 必须知道地图的总面积。你自告奋勇写了一个计算这个总面积的程序。输入格式输入包含多组测试用例。对于每组测试用例,第一行包含整数 n,表示总的地图数量。接下来 n 行,描绘了每张地图,每行包含四个数字 x1,y1,x2,y2(不一定是整数),(x1,y1) 和 (x2,y2) 分别是地图的左上角位置和右下角位置。注意,坐标轴 x 轴从上向下延伸原创 2021-05-27 07:21:29 · 394 阅读 · 3 评论 -
线段树例题4AcWing243
一个简单的整数问题给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问数列中第 l∼r 个数的和。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案占一行。数据范围1≤N,M≤105,|d|≤10000原创 2021-05-26 18:50:40 · 259 阅读 · 1 评论 -
线段树例题3AcWing246
Interval GCD 区间最大公约数给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD)。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案原创 2021-05-25 20:37:00 · 222 阅读 · 1 评论 -
线段树例题2AcWing245
#include<iostream>#include<cstdio>using namespace std;#define int long long const int N=500010;int n,m,w[N];struct YJC{ int l,r; int sum,lmax,rmax,tmax;}tr[N*4]; void pushup(YJC &u,YJC &l,YJC &r){ u.sum =l.sum +r.sum; u原创 2021-05-25 16:13:32 · 196 阅读 · 1 评论 -
线段树例题AcWing1275
最大数给定一个正整数数列 a1,a2,…,an,每一个数都在 0∼p−1 之间。可以对这列数进行两种操作:添加操作:向序列后添加一个数,序列长度变成 n+1;询问操作:询问这个序列中最后 L 个数中最大的数是多少。程序运行的最开始,整数序列为空。写一个程序,读入操作的序列,并输出询问操作的答案。输入格式第一行有两个正整数 m,p,意义如题目描述;接下来 m 行,每一行表示一个操作。如果该行的内容是 Q L,则表示这个操作是询问序列中最后 L 个数的最大数是多少;如果是 A t,则表示向原创 2021-05-24 19:55:05 · 219 阅读 · 1 评论 -
树状数组例题AcWing241
楼兰图腾在完成了分配任务之后,西部 314 来到了楼兰古城的西部。相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(V),一个部落崇拜铁锹(∧),他们分别用 V 和 ∧ 的形状来代表各自部落的图腾。西部 314 在楼兰古城的下面发现了一幅巨大的壁画,壁画上被标记出了 n 个点,经测量发现这 n 个点的水平位置和竖直位置是两两不同的。西部 314 认为这幅壁画所包含的信息与这 n 个点的相对位置有关,因此不妨设坐标分别为 (1,y1),(2,y2),…,(n,yn),其中 y1原创 2021-05-24 17:47:58 · 174 阅读 · 1 评论