这个fw做题的时候突然想总结一下毒瘤数据结构(持续更中,于是就有了这篇文章...
你别急,我保证一定在CSP-J/S之前更新完,给大家一览!
Ps:本文不再介绍STL中有的数据结构。这里仅介绍NOI大纲1~8级的数据结构
目录一览:
1.并查集 2.ST表 3.线段树&树状数组 4.主席树 黄题 黄题 绿题 蓝题
一,并查集(模板黄题
有时候,我们要处理一种“帮派”问题,大概是这样的:a加入b的帮派,a的帮派和b的帮派结合...类似这样的操作。为了更好的解决这样的问题,我们用并查集来表示。
基本思想:用一个pre数组表示这个人的上级,那么查询a和b食不食再同一个帮派里,只需要比较他们的终极上司食不食一样就行。如果每次都这样查询的话,效率太低。可以使用记忆化搜索。下次找的时候直接返回即可。查询复杂度为O(log2n)O(log_{2}n)O(log2 n)(大概)
干讲不行,上例题:
1.(模板)并查集
题目中有查询和加入操作,按照上面的分析来。
一定要初始化pre[i]=i!!!!!!每年都有人忘记这个东西。
2.修复公路
并查集板子题。
先按照时间排序好开通路线的时刻,然后按顺序枚举:将此公路两端的城市x,y加入集合中(如果不相同),那么只要加n-1次所有城市就都在一个集合中了。此时最早通车时间就是当前这条路的开通时间。
ps:此类想法会与后面一个算法不约而同
3.食物链
这道题给我的印象超级深刻,当时老师让我们尝试新的做法,我尝试了八个小时也没有试出来,最后老师说,这个算法是错的...
此道题也可以用 带权并查集 解决,这里介绍普通做法。
定义一个三倍空间的并查集,其中n是同类并查集,x+n是猎物,x+2*n为天敌(题目中的关系满足三角形)
根据逻辑即可求解。
(代码找不到了,用别人题解上的吧,反正思路都一样)
二,倍增——ST表
ST表是解决RMQ问题的不二之选。他可以把单次静态查询变为O(1)O(1)O(1),也就是说,它是离线算法。预处理复杂度为O(nlogn)O(nlogn)O(nlogn)
基本想法:为了把区间查询想树一样降到O(logn)O(logn)O(logn)级别的复杂度,不难联想到二进制优化。
设dp[i][j]dp[i][j]dp[i][j]为以i为起点,长度为2j2^{j}2j中的最值,那么 dp[i][j]dp[i][j]dp[i][j]=min/max/...(dp[i][j−1],dp[i+2j−1][j−1])min/max/...(dp[i][j-1],dp[i+2^{j-1}][j-1])min/max/...(dp[i][j−1],dp[i+2j−1][j−1])
于是就可以建表,初始值设dp[i][0]=初始值dp[i][0]=初始值dp[i][0]=初始值
1.BALANCED LINEUP G
RMQ板子题。
由于n过大,可以用ST表预处理。
(dp表示最大值的st表,pd表示最小值的st表)
2.策略游戏
一道巨恶心的题目,恶心值1100/1500,仅次于时间复杂度。
第一步,把csp语言转化成中文:
两个人在A数组的[l1,r1]区间里面选x,B数[l2,r2]区间里面选y,一个人要使xy最小,一个人要使xy最大。
请看图。
于是代码里就有6个st表,分别求,然后按照上面的思路来就行。
三,线段树&树状数组(模板绿
线段树是区间动态修改&区间动态查询的不二之选。 可能我们普通枚举,时间复杂度达到了O(nq)O(nq)O(nq),再来一个大数据&卡常让你喜提TLE。
众所周知,使用 树 这种结构 可以让查询&修改操作降到O(logn)O(logn)O(logn)。下面以[模板]线段树1为例来分析。
先来一个求左儿子,右儿子的函数,方便以后使用。
然后,我们需要一个重要的东西——tag标记。又称lazytag。每次都一个一个修改太麻烦,我们可以先标记,再统一修改,也就是说,它可以传递式记录这个节点的改变,充分利用树的特征。于是,修改一个区间就变成了修改这个区间的LCA,再传递。
按照这样,我们可以建树了。
具体解释见注释。
1.[模板]线段树2
加上一个乘法,不会有人要抄题解了吧
还是同样的,加上一个tag,表示乘法tag。
再下传操作中,我们需要更新一下乘法和加法的顺序。
再pushdown中,tree=tree * 父亲的乘法tag+父亲加法乘上区间
cheng=cheng乘上父亲乘法
jia=jia*父亲乘法+父亲加法
再update中,与线段树1一样。
2.数据中心能耗分析
作为排位赛最后一题,出的还是太水了,为什么要放一个模板
本题要求立方和。
稍微推导一下。
定义sum1,sum2,sum3为1次,2次,3次立方和。在pushdown中修改即可。
代码我就不放了。
哎算了还是放一下吧
请我的机房朋友修改了一下,所以码风会和之前不一样。
四,主席树(权值线段树)(模板蓝
主席树就是在线段树上加上“权值”具体一点的说,主席树的每一个节点都在维护一棵线段树。
与线段树不同的是,每个节点代表的是[l,r][l,r][l,r]的范围。
干讲没用,上例题。
1.王老师的奇妙集合
主席树板子题。
数据比较大,使用主席树优化到O(nlogn)O(nlogn)O(nlogn),而删除操作就是把元素交换到一个不为人知的地方。
具体解释看代码。
具体的请读者自己练习。
最后祝大家明天CSP RP+++!!!