数据结构
文章平均质量分 79
Kalzn
qdu-打不到名额的菜鸡一枚
展开
-
线段树 (ICPC小米预赛第二场 C Data Structure Problem)
题目链接题意:给你一个两个序列bbb和aaa,序列ccc由其生成,生产方式为:c0=0,ci=max{ci−1+bi,ai}c_0=0,c_i=max\{c_{i-1}+b_i,a_i\}c0=0,ci=max{ci−1+bi,ai}每次会对a、b进行单点修改,对c进行单点询问。题解:首先如果不考虑a序列的影响。那么ci=∑j=1ibic_i=\sum_{j=1}^ib_ici=∑j=1ibi此时我们考虑因为有些位置,ai>bia_i>b_iai>bi所以,我们必原创 2020-10-31 22:06:41 · 256 阅读 · 1 评论 -
hash (codeforces 1394B Boboniu Walks on Graph )
题目链接题意:给你一个k长度序列c,和一个有向图,对于任意一个出度为s的点,下一步都会沿着权值第c[s]小的边走到下一节点。问:有多少符合要求的序列c,使得按照这个序列走,对于所有的点,都可以走回自己。题解:真的不会。一看题解,好家伙,hash(bitset也可)。因为如果想要每个点都会走回自己。那生成图就要满足是几个环的集合。满足此情况的充分必要条件是每个点的出度和入度都是1。题目保证了权值两两不同,所有每个点的出度一定为1。所以我们建立一个入度序列d。如果一个终点为v的边呗被选择了,则有:d[v]原创 2020-10-27 10:41:34 · 216 阅读 · 0 评论 -
线段树 (ICPC小米预赛第一场 E Phone Network )
题目链接题意:给你一个1到n的数组。元素取值是[1, m]。对于1到m的每一个i。你要回答出至少包含[1,i]的所有元素各一次的最小区间长度。题解:距离出线只差一题。队友在搞G题构造,我在搞这个。最后没出。没办法。一看题解,发现真的只差一步就搞出来了:vector存入1到m的每个数字的位置序列。想到了。线段数维护每个点作为左端点时的最近右端点。想到了。从[1,i]递推[1,i+1],因为这个数值单调可以二分寻找赋值。也想到了。最后一步通过最近右端点怎么维护最小区间长度,愣是没想到。很骚的是,题解也一笔带原创 2020-10-26 18:57:27 · 288 阅读 · 0 评论 -
可并堆(左偏树)
如题意,即为可以合并的堆,在普通堆的基础上,我们在计入每个节点的父节点和该节点子树距离这个节点最近的叶子。我们在原堆的基础上追加一个性质:树的左孩子的距离不小于有孩子的距离(左偏),为什么要这么做呢,注意是建少合并时的数量。(启发式合并思想)。于是合并时,我们,针对堆的性质,对于两个节点,我们尝试把权值大的点挂在到小的点上(小根堆),然后进行递归处理。处理完成后,然后如果左孩子的距离小于右孩子的距离,即交换两个节点。另外有pop操作,我们取出首节点后,清除首节点,然后合并他的左右孩子即可。#inclu原创 2020-09-04 14:59:36 · 260 阅读 · 0 评论 -
LCT/尺取(HDU-6858 Discovery of Cycles)
题目连接题意:给你一个n点m边无向图。有q次查询,每次查询区间l, r。问:该区间中的边形成的子图能否构成至少一个简单环。查询必须在线。题解:对于每个边i,我们都可以找出从它开始最早的可以形成简单环的端点,即区间[ i, ans[i] ],这里有结论,f(i)=ans[i]是单调递增的。所以可以尺取。对于所有i,求出最短区间,然后就可以O(1)查了。这里需要一个数据结构:可以动态断边、删边、并查看该图任意两点的联通性(又不需要真正的连接环,这点很重要)。显然是LCT了。在判定两点是否联通时,我们先原创 2020-09-04 14:58:32 · 175 阅读 · 0 评论 -
线段树(石油大学组队赛 G: Performance Review)
题意:现有一个公司,初始有n个员工。有m年,第i年裁员Ri个人,新增Ri个员工。每个员工都有一个能力值,裁员时选择能力值最低Ri个的裁。保证能力值互不相同。有k次会累计的修改。将第x年新进的第y名员工的能力值改为z。主角是初始1号员工。问:在k次修改后,主角能不能坚持m年不被裁。题解:首先明确一点,如果一个人的能力值改前和改后与1号员工的的能力值的相对大小不变。则此后所有的裁员,1号员工则不受影响。粗略证明:首先明确,如果当前有x名员工比1号低,y名员工比1号高,则无论这x,y名员工的能力值大小.原创 2020-09-03 11:45:33 · 208 阅读 · 0 评论 -
线段树合并(HDU-5575 Discover Water Tank)
题目连接题意:给你一个长为n,宽为1,高为无穷的水缸。里面有n-1个高度不一的隔板隔开为1x1大小的区域。里面的水遵循物理定理。给你m次查询和回应,每个查询<x,y,z>。代表查询第x个区域高度为y+0.5的地方,如果z为0,回应为这个位置没有水,如果为z为1,则回应是有水。问:这些回应最多有多少个正确的。题解:从这个题就能清楚的看到人与人之间的差距。有的大佬用prioriaty_queue,50line直接通过。有的人用可并堆80line直接通过。有的人用线段树合并,接近200line原创 2020-09-03 08:44:22 · 180 阅读 · 0 评论 -
线段树补充模板
这里主要补充本人遗漏的线段树模板,没有说明。扫描线,并面积const int N =1e5+5;struct Node{ double x; double y1, y2; int w; Node(){} Node (double a, double b, double c, int d) :x(a), y1(b), y2(c), w(d){}}su[N];struct node{ int l, r; double sum;原创 2020-08-31 13:48:10 · 124 阅读 · 0 评论 -
Treap树(插入、删除、前驱后继、排名数、数排名)
P3369 【模板】普通平衡树using namespace std;const int N = 2e5+5;const int inf = 0x3f3f3f3f;struct Node{ int ch[2], val, si, cnt; int mi, mx, ans; int da;} tr[N] ;int root, tot;int newnode(int v){ tr[++tot].val = v; tr[tot].da = rand();原创 2020-08-31 13:47:13 · 252 阅读 · 0 评论 -
线段树/维护转移矩阵(中石油组队赛 K: Addition Robot)
显然是个线段树,如果初始值为x,y。则最后答案显然是x′=a1x+b1y, y′=a2x+b2yx'=a_1x+b_1y, \ \ y'=a_2x+b_2yx′=a1x+b1y, y′=a2x+b2y我们就是用线段树维护这个系数。题目是关于状态累加的,显然可以用矩阵来维护转移状态。而矩阵乘是满足结合律的,显然可以用线段树维护(其实我们队一开始想的是分块,可是一拍脑门,既然都可以结合合并了,那还用个pi的分块)。这里我们如果将初始x,y写入矩阵:ans=.原创 2020-08-31 12:41:26 · 225 阅读 · 0 评论 -
线段树合并(四道例题)
顾名思义,就是合并两个同构(就是维护的区间长度一样)线段树,其实也没啥比较nb的算法,就是一个一个节点的合并,但是如果在n个要合并的线段树里,如果一共有m个元素,则配合动态开点,复杂度会均摊成一个惊人的O(mlogn)O(mlogn)O(mlogn)所以,在多次合并的均摊复杂度是非常优秀的.另外线段树合并还可以和线段树分裂一起构成维护一组线段树森林的方法我们每次合并一个点,就是综合两个线段树表示...原创 2020-02-14 14:34:48 · 1839 阅读 · 3 评论 -
线段树分裂/合并模板
模板链接最早从zx神仙口中得知这个玩意,但是一直没学,现在学一下再说,发现不是什么神仙东西,说实话有点小失落.按照区间分裂可以在O(logn)O(logn)O(logn)内完成,不过,合并操作需要枚举线段树的每个点进行合并,效率不是太高,数据量1e3差不多就是极限了.且应用面不是很广.洛谷所给的模板是多个权值线段树的维护操作.下面是模板代码:#include <iostream&g...原创 2020-02-12 21:39:26 · 576 阅读 · 0 评论 -
可持久化数组及并查集(概念及模板)
可持久化数组模板链接顾名思义,就是可以查询历史版本的数组,我们使用主席树维护这个数组就ok了.从此延伸出了可持久化并查集等很多可持久化结构,比较简单,下面是模板代码:#include <iostream>#include <cstring>#include <string>#include <vector>#include <q...原创 2020-02-12 15:05:27 · 134 阅读 · 0 评论 -
AC自动机学习/模板
题目连接(只提供模板及简单思路。)憨批的第一个字符串算法。前置知识:Tire树、KMP匹配思想第一步:首先把所有的匹配串建一个Tire树。第二步:从Tire树根节点开始,一个一个字符的匹配模式串。到某一个节点失配后,寻找一个fail指针,该指针从这个节点,到它的最大后缀的节点第三步:反向fail指针建树。第四步:fail树上树形dp。#include <iostream&g...原创 2019-11-06 20:02:22 · 147 阅读 · 0 评论 -
KMP/前缀出现次数统计(codeforces 432D)
题目链接对于这个题,我们再利用KMP求出next数组后,可以有一下方法统计前缀字符出现的次数。 for (int i = 0; i <= na; i++) cnt[i] = 1; for (int i = na; i >= 1; i--) cnt[nta[i]] += cnt[i];第一个for,很好理解,就是前缀本身就算一个,那么后一个for呢?我们看样例:...原创 2019-11-03 21:13:01 · 899 阅读 · 0 评论 -
可持久化Tire树(upc个人赛 腿部挂件)
问题 A: 腿部挂件时间限制: 2 Sec 内存限制: 256 MB题目描述Jim是一个热爱打游戏的小伙子,可惜他的游戏水平不太行,以至于经常在游戏里被别人欺负。而且Jim不仅游戏玩的菜,他还很爱喷人,但是由于自己的垃圾操作,他又喷不过别人。为了改善这种局面,Jim决定成为一个腿部挂件(俗称抱大腿)。已知现在有N个选手可供Jim选择,每位选手的能力值为 ai。N位选手不一定每位选手都有...原创 2019-11-01 20:32:46 · 395 阅读 · 2 评论 -
splay树前导知识/树的旋转
现在开始学习splay树。splay树的核心操作就是树的旋转现在我们开始学习树的旋转。树的单旋树的单旋有两种,是基本的操作。1.左旋(ZAG)针对一个节点进行左旋:第一步:建立指针指向这个节点第二步:将该节点的右孩子的左孩子挂载成为当前节点的右孩子。第三步:将指针指向该节点的右孩子,将该节点挂在到它的右孩子上,成为它的右孩子的左孩子别慌。。。见图所示:我们对1节点进行右旋:...原创 2019-08-28 20:30:38 · 378 阅读 · 0 评论 -
splay树/基本思路及模板
模板链接伸展(splaying)操作我们把一个节点通过旋转来到根节点的位置称为伸展:对于上图。如果我们想把8号节点伸展到0位置。我们必须对8进行以下操作:1.对于(8,6,5)节点进行ZAG-ZIG双旋2.对于(1,2,8)节点进行ZAG-ZAG双旋3.对于(0,8)节点进行ZIG单旋这时我们注意到,8节点已经到达0位置,伸展结束。插入操作splay树的插入操作与普通二叉搜...原创 2019-08-28 22:44:23 · 236 阅读 · 1 评论 -
splay树/区间树实用模板(查删、数排名、排名数、前驱后继、区间翻转)/转载:线段树套Splay树
模板链接splay树比较全面的一个板子,并进行压缩优化代码,比较实用。后期再更新一个文艺平衡树就差不多了???下面是模板代码:#include <iostream>#include <cstring>#include <string>#include <vector>#include <algorithm>#includ...原创 2019-08-29 19:08:49 · 436 阅读 · 0 评论 -
树链剖分(边化点)/最小生成树(codeforces 609E Minimum spanning tree for each edge)
题目链接思路,先求最小生成树,然后对于每一条边,求两端点之间的最大边权。答案是:最小生成树总花费-最大边权+该边边权这里注意边权化点权的思路。我们类比线段树维护连续区间,让每个边的边权用这个边链接的孩子节点的点权表示。在树链查改时如果在一个重链上,则有: if (dep[x] > dep[y]) swap(x, y); if (dfn[x] != d...原创 2019-08-30 10:42:54 · 246 阅读 · 0 评论 -
后缀自动机入门/基本概念
教程链接(本文为适应自己的理解,对原文做出删改,建议到原文学习)后缀自动机可以干啥?后缀自动机(SAM)可以解决许多字符串相关问题。是一个特别nb的数据结构。它可以:1.在另一个字符串中搜索一个字符串的所有出现位置。2.计算给定的字符串中有多少个不同的子串。SAM是啥?》》SAM是一个有向无环图。节点被称为状态,边就是状态之间的转移。》》图存在一个源点t0t_0t0 ,称作...原创 2019-08-30 14:35:25 · 307 阅读 · 0 评论 -
LCT学习笔记/基本思路
我仅一届平凡人LCT(Link Cut Tree)可以看作是Splay树维护的树链剖分。我们可以在一个动态树上维护树链信息。重链剖分与实链剖分在Splay树的基础上,我们定义一条实边:一个节点的孩子节点指向一个节点,这个孩子节点的fa指针也指向这个节点(即双向边)相对性的,我们定义一条虚边一个节点的孩子节点指向一个节点,这个孩子节点的fa指针不指向这个节点(即但向边)我们把一...原创 2019-09-04 22:19:11 · 227 阅读 · 0 评论 -
线段树/贪心(徐州网络赛2019 M. Longest subsequence)
题目连接思考后不难发现:对一个字符串我们匹配到一个位置,然后取一个大于当前位置的字符,则我们就可以把这个字符后面的所有字母选完。首先,我们贪心地匹配出每一个字符出现的第一个匹配位置。记录是匹配的第几个字符。例如aabbcc匹配abc得到的数组:1 0 2 0 3 0枚举每一个非0的位置,我们在剩余区间的第一个(位置上第一个)比下一个需要匹配的字符大的。然后答案就是已经匹配的数...原创 2019-09-07 18:07:52 · 200 阅读 · 0 评论 -
Splay树(HDU - 5493 Queue)
题目链接蒻苟还是蒻苟,知道是线段树,写不出来。。。只能尝试用Splay维护。还好就是一个定点插入问题,比较好维护。可是感觉还是很有用的,890ms比线段树快了一点,嘻嘻。(尝试自我安慰) 不过,以后的定点插入就可以用这个作为板子了。。还算不亏。下面是ac代码:#include <iostream>#include <cstring>#include <str...原创 2019-09-13 16:36:05 · 207 阅读 · 0 评论 -
树上主席树(洛谷 P2633 Count on a tree)
题目链接学了学树上主席树。之前一直以为树上主席树必须和树链剖分结合,学了之后发现不用。直接按照自然dfs序建树。每个节点都继承自它的fa节点。然后我们查询某路径(x,y):tr[x].sum+tr[y].sum−tr[lca(x,y)].sum−tr[fa(lca(x,y))].sumtr[x].sum + tr[y].sum - tr[lca(x,y)].sum - tr[fa(lca(x,...原创 2019-09-29 21:24:29 · 209 阅读 · 0 评论 -
树链剖分 完全模板(子树查改+树链查改)
题目链接以洛谷题为原题。看代码。下面是模板代码(横线之外的为模板代码):/*--------------------1.mchange(x, y, v) 树链更改(x,y)2.mask(x, y) 树链查询(x,y)3.achange(x, v) 子树更改x4.aask(x) 子树查询x--------------------*/...原创 2019-08-28 18:58:44 · 375 阅读 · 0 评论 -
字符串hash\贪心(upc组队赛 Isomorphic Inversion)
Isomorphic Inversion时间限制: 1 Sec 内存限制: 128 MB题目描述Let s be a given string of up to 106 digits. Find the maximal k for which it is possible to partition s into k consecutive contiguous substrings, s...原创 2019-08-27 19:45:06 · 220 阅读 · 0 评论 -
线段树/技巧(HDU - 2795 Billboard)
题目链接这个题只要稍加思索就会变成线段树裸题。首先我们维护的线段树是每一行还剩的空间。(初始为w)贴海报其实就是单点修改,问题是往哪里插入呢。我们查询剩余空间的时候,只要左子树区间每行剩余区间的最大值大于等于要插入的海报,我们就往左子树搜索。如果左子树空间不足,右子树有空间,就往右子树搜索。都不足就返回-1。即普通题目查询是知位置查数值,这个题目是知数值查位置。下面是ac代码:#includ...原创 2019-08-07 19:31:21 · 182 阅读 · 0 评论 -
树状数组/离散化 (codefroces 540E Infinite Inversions )
题目链接这个题本蒻苟看了一天,心态爆炸。首先用树状数组求逆序对是模板,在此主要说的是离散化的过程。对于一个区间,如果它两端的数字被交换了,那么他就会提供 区间长度的逆序对,我们用一个数字代替一段区间,区间长度为它的权值。然后进行离散化。具体过程看代码。ps.注意要用long long下面是ac代码:#include <iostream>#include <cstdi...原创 2019-08-07 19:21:25 · 227 阅读 · 0 评论 -
线段树与dfs序(HDU - 3974 Assign the task )
题目链接dfs与线段树的结合:我们记录对于进入每个节点和回溯每个节点的时间戳:void dfs(int cur){ cnt++; l[cur] = cnt; for (int i = he[cur]; i; i = ne[i]) { int y = ver[i]; dfs(y); } r[cur] = cnt;...原创 2019-08-07 19:13:24 · 112 阅读 · 0 评论 -
权值线段树模板(HDU-4217 Data Structure? )
题目链接权值线段树模板题(因为long long问题wa了一发),详细学习请参照其他大佬博客,代码仅供参考。下面是ac代码:#include <iostream>#include <string>#include <cstring>#include <queue>#include <cmath>#include <c...原创 2019-08-08 16:35:37 · 187 阅读 · 0 评论 -
树状数组求逆序对(HDU - 5775 Bubble Sort)
题目链接一开始,我认为是:每个点的最左、最右位置应该是初位置和末位置。可是仔细考虑过才发现,在冒泡排序的过程中,每个数字都是有一个先向左再向右最后到达有序位置。那最右位置应该是max(起始位置,有序位置)那最左位置呢?理解冒泡排序,不难发现:对于在一个数字左边的大于该数字的数,总比该数优先到达有序位置。例如,对于下面这个序列:9 5 3 1 4 6 8 10 2 11 7数值4...原创 2019-08-08 16:27:57 · 172 阅读 · 0 评论 -
线段树lazy技巧/常见坑点(Can you answer these queries? HDU-4027)
题目链接对于这种看似比较高大上的题目。(单点修改运算与pushup运算不符合交换律。)但是,我们发现,对于一个long long咱们开平方没多久就会变成不变的1。咱们只要标记一下这个区间是不是都是1,如果都是,就直接return掉。ps.线段树常见坑点不保证给出的区间两端点前者小于等于后者。又是一个可以让我wa一天的地下面是ac代码(采用边读入边建树的方式):#include <io...原创 2019-08-06 10:18:47 · 114 阅读 · 0 评论 -
dp/字符串hash (Phalanx HDU - 2859)
题目链接对于这个题目,学习字符串hash技术。首先一般用131进制数打hash表。我们可以再O(n)打出hash表,还可以O(logn)查询最长公共先/后缀。对于每一个区间[l,r]的子串,其hash值是f[r] - f[l-1] * 131^r - l + 1说起来抽象,但是实际上比较简单,直接上代码吧下面是ac代码:#include <iostream>#inc...原创 2019-07-26 20:54:35 · 184 阅读 · 1 评论 -
线段树、树状数组与离线算法(两个例题 HDU-3333 Turing Tree / HDU-4417 Super Mario)
离线对于线段树是一个简单的进阶技巧,必须掌握!下面由两个例题引入。HDU-3333对于这类题,我们发现,它们都是比较难以区间整体修改的题目,但是,单点修改比较容易,这个题单点的和就是它本身,但是,若想修改区间,我们必须判重。比较难搞。所以,我们可以考虑离线化。其实,我们利用单点修改可以想到:如果一个数字在我们查询的区间已经存在了,那我们就把他change为0,我们将所以询问按照右端点从小到大排...原创 2019-08-04 19:04:50 · 218 阅读 · 0 评论 -
树状数组 模板(HDU - 1166 敌兵布阵 )
题目链接树状数组、线段树模板,没啥好说,不过,这个题的数据太水了。我在刚刚接触算法的时候写了发暴力,竟然过了。。。。。现在从新交了一发。。竟然也过了2333333暴力与树状数组:下面是ac代码://树状数组#include <iostream>#include <string>#include <cstring>#include <que...原创 2019-08-03 17:39:00 · 131 阅读 · 0 评论 -
区间染色/线段树 (ZOJ - 1610 Count the Colors )
题目链接模板题,类似题详解注意的是,题目所给的是区间,不是点,5 6 3并不是给5、6两个点染3号色,而是在(5, 6)上。要不是1号样例比较良心,我可以wa一天在update时,让右端点减一,就可以应对这种情况(即,把每个区间用它的左端点表示)下面是ac代码:#include <iostream>#include <string>#include <c...原创 2019-08-03 15:40:11 · 267 阅读 · 0 评论 -
离散化/线段树 (POJ - 2528 Mayor's posters)
题目链接对于这个题,网上的很多题解对离散化的过程基本是一笔带过,本蒻苟看了很久才懂。现在在这详细讲一下这个题区间的离散化。首先,看下面这个例子(几个区间):[1, 5][2, 7][8, 10]在数组上表示:这是咱们发现一个事实:对于这些区间,我们保留某些点的信息是没有意义的,比如:3,4,6,9。对于这些点,它们一直被包含在一个大区间里。所以,我们考虑把这些点压缩点,你可以想...原创 2019-08-03 13:32:08 · 1137 阅读 · 12 评论 -
树链剖分前导知识(HDU-5242 Game)
这个题其实用树链剖分知识可以完美解决,(但是大材小用),我们可以贪心出最优解。首先我们可以求出每个节点到根节点的距离。最后按照这个递减顺序开始带标记的在跑一遍图。这样保证每个节点只走过一次,路径还是最大的。下面是ac代码:#include <iostream>#include <cstdio>#include <algorithm>#include ...原创 2019-08-14 21:04:52 · 116 阅读 · 0 评论 -
线段树/区间合并(POJ 3667 Hotel )
题目链接这个题是集训是讲的模板题,但是我没(mei)听(you)懂(ting),于是做题时比较惨,卡了不少时间。最后想:struct Node{ int l, r; int sum;//记录该区间内的最大空余连续区间 int add;//延迟标记 bool flag;//全空标记 int ls, rs;//记录该区间中,最大空余前缀、后缀/}tr[N...原创 2019-08-20 10:59:48 · 101 阅读 · 0 评论