数据结构-平衡树/set
Maxwei_wzj
AFO
展开
-
【POJ3468】A Simple Problem with Integers-线段树和伸展树入门题
【POJ3468】A Simple Problem with Integers-线段树和伸展树入门题原创 2016-07-23 18:09:00 · 342 阅读 · 0 评论 -
【BZOJ3166】ALO(HEOI2013)-set+可持久化trie
测试地址:ALO 题目大意:给定一个数列AAA,每项各不相同,令一个区间的价值为:区间中的次大值与区间中某个其它元素异或起来能得到的最大值,求最大的区间价值。 做法:本题需要用到set+可持久化trie。 我们知道,如果一个元素是次大值,那么我们肯定希望找到以这个元素为次大值的极大区间(即向左右任何一边扩展都不能满足条件的区间),这样就更有机会凑出更大的价值。以这个元素为次大值,等价于区间中...原创 2018-04-25 08:45:17 · 187 阅读 · 0 评论 -
【BZOJ4825】单旋(AHOI&HNOI2017)-set+树状数组
测试地址:单旋 做法:本题需要用到set+树状数组。 首先,我们注意到题目中单旋只涉及到最小值和最大值,考虑到旋转是对称的,我们先只考虑单旋最小值的情况。 显然目标点每次都是往右旋转,往右旋转对点的影响是:该点的右子树深度没有影响,该点深度减少111,而对于其它影响到的点深度都增加111。那么我们可以得到一个非常优美的性质:每一次单旋,除了以目标点为根的子树外,其它所有点深度都增加111。并...原创 2018-05-11 20:45:32 · 360 阅读 · 0 评论 -
【BZOJ4012】开店(HNOI2015)-动态点分治+set
测试地址:开店 做法:本题需要用到动态点分治+set。 注意到每次只询问一端为定点的所有路径,这就提示我们使用动态点分治。我们每次查询时,从询问点开始在点分树上往上走,每走到一个点,就统计另一个端点在这个点的某棵子树中的所有路径的贡献,包含询问点的子树是不计算的(因为会算重),因为一个点度数最多为333,所以一个点的子树数量是常数级别的。 那么怎么计算这个贡献呢?我们需要求在点分树的某棵子树...原创 2018-05-18 11:59:14 · 163 阅读 · 0 评论 -
【BZOJ1178】会议中心(APIO2009)-贪心+倍增+set
测试地址:会议中心 做法:本题需要用到贪心+倍增+set。 如果这题单纯只求最多的线段数,相信大家都会贪心求了,但是鉴于我太弱今天才会,这里还是写一下吧。 把所有线段按左端点从小到大排序,按右端点为第二关键字从大到小排序,我们首先维护一个栈,是为了把所有包含其它线段的线段删掉,因为选这些线段一定不优。删完之后,这些线段的左右端点都是单调的了。那么我们贪心从小到大选择,一旦能选某条线段就马上选...原创 2018-05-13 10:02:42 · 751 阅读 · 0 评论 -
【BZOJ2658】小蓝的好友(ZJOI2012)-扫描线+Treap
测试地址:小蓝的好友 做法:本题需要用到扫描线+Treap。 首先,很快想到补集转化,用总的子矩形数(n(n+1)2⋅m(m+1)2n(n+1)2⋅m(m+1)2\frac{n(n+1)}{2}\cdot \frac{m(m+1)}{2})减去不包含任何资源点的子矩形数计算答案。 考虑自上而下用扫描线,每次计算下边界在某一行的,不包含任何资源点的子矩形数目。考虑上边界所在的行,这一行能选为上...原创 2018-06-22 16:37:55 · 260 阅读 · 0 评论 -
【BZOJ2342】双倍回文(SHOI2011)-Manacher+set
测试地址:双倍回文 做法:本题需要用到Manacher+set。 首先看到回文子串,跑一遍Manacher是免不了的了,关键在于如何利用这些信息求最长的双倍回文子串。 考虑枚举整个串的对称轴xxx(显然这个对称轴一定是两个字符之间的位置),令f(x)f(x)f(x)为xxx这个位置的最长回文半径,即以这个位置为对称轴的最长回文子串的半长,那么对于之后的一个位置yyy,定义这个yyy对xxx合...原创 2018-06-15 15:39:19 · 235 阅读 · 0 评论 -
【LOJ2585】新家(APIO2018)-线段树+multiset
测试地址:新家 做法:本题需要用到线段树+multiset。 这题题意有点复杂,先理一下:数轴上有一些带颜色的点,每个点会在某个特定的时间段出现,若干个询问,每次询问某个时刻上离一个坐标距离最远的颜色的距离。坐标和颜色的距离定义为,该坐标与当前出现的所有该颜色的点的最小距离。 理完了题意,就可以想题了。首先因为没有强制在线,所以显然将操作按时间排序,而且把某个时间段出现某个点变成两个操作:某...原创 2018-06-25 20:12:03 · 321 阅读 · 0 评论 -
【HDU5299】Circles Game-扫描线+set+树上删边博弈
测试地址:Circles Game 题目大意:给定nnn个圆,圆两两之间只可能有相离或包含两种关系。两个人博弈,每次可以取走一个圆以及被这个圆包含的所有圆,不能取的人输,问先手必胜还是必败。 做法:本题需要用到扫描线+set+树上删边博弈。 两个圆之间只可能相离或包含,那么显然这种包含关系能够构成一座森林的形状。如果再将所有不被任何圆包含的圆与一个空点相连,这就是一棵树了。意识到我们每次取走...原创 2018-07-08 12:15:20 · 207 阅读 · 0 评论 -
【CF487E】Tourists-圆方树+multiset+树链剖分
测试地址:Tourists 题目大意:一个nnn个点mmm条边的无向连通图,每个点有点权,要求维护单点修改,还有若干次询问,每次询问两个点之间的简单路径上的点权最小值最小是多少。 做法:本题需要用到圆方树+multiset+树链剖分。 做过APIO2018-铁人两项的同学应该很快能看出来,我们实际上就是要找一个中间点,使得这个中间点的点权最小,而能作为中间点的点我们在上面那题讨论过了:路径所...原创 2018-06-19 20:27:46 · 315 阅读 · 0 评论 -
【BZOJ3991】寻宝游戏(SDOI2015)-贪心+DFS序+set
测试地址:寻宝游戏 做法:本题需要用到DFS+set。 首先需要看出,无论从哪个点出发结果都相同。然后就是要找一种能得到最优解的走法,显然走每条边222次是最优的,那怎么样构造出走法呢?其实只要按照这些点的DFS序顺序走下去,最后走回第一个点即可。因为对于涉及到的每条边,只下去一次再上来一次,所以这个肯定最优。那么我们每次插入或删除一个点时,实际上只影响到它在DFS序中相邻的两个点之间的贡献,...原创 2018-03-16 20:49:07 · 257 阅读 · 0 评论 -
【CF392D】Three Arrays-set+multiset
测试地址:Three Arrays 题目大意:有三个长为nnn的数列A,B,CA,B,CA,B,C,要求从AAA中取前aaa个数,从BBB中取前bbb个数,从CCC中取前ccc个数,使得取出的数的并集和这三个数列的并集相等,求最小的a+b+ca+b+ca+b+c。 做法:本题需要用到set+multiset。 这题也是清北学堂讲的,思想非常不错,写在这里跟大家分享。 考虑只有两个数列怎么做...原创 2018-04-12 19:40:53 · 295 阅读 · 0 评论 -
【NOI2003T2】文本编辑器Editor-伸展树数列操作
【NOI2003T2】文本编辑器Editor-伸展树数列操作原创 2016-08-29 22:15:03 · 1243 阅读 · 0 评论 -
【BZOJ1269】文本编辑器editor(AHOI2006)-NOI原题升级版
【BZOJ1269】文本编辑器editor(AHOI2006)-NOI原题升级版原创 2016-08-30 20:56:58 · 578 阅读 · 0 评论 -
【NOI2004T1】郁闷的出纳员-平衡树入门题
【NOI2004T1】郁闷的出纳员-平衡树入门题原创 2016-08-26 11:53:31 · 331 阅读 · 0 评论 -
【BZOJ2049】洞穴勘测(SDOI2008)-LCT真·模板题
【BZOJ2049】洞穴勘测(SDOI2008)-LCT真·模板题原创 2017-04-23 17:28:25 · 307 阅读 · 0 评论 -
【BZOJ2002】弹飞绵羊(HNOI2010)-LCT模板题
【BZOJ2002】弹飞绵羊(HNOI2010)-LCT模板题原创 2017-04-23 10:45:09 · 410 阅读 · 0 评论 -
【HDU3966】Aragorn's Story-树链剖分或LCT维护路径
【HDU3966】Aragorn's Story-树链剖分或LCT维护路径原创 2017-04-24 11:31:08 · 392 阅读 · 0 评论 -
【NOI2014T2】魔法森林-LCT维护最小生成树
【NOI2014T2】魔法森林-LCT维护最小生成树原创 2017-05-19 00:57:50 · 720 阅读 · 0 评论 -
【BZOJ1861】书架(ZJOI2006)-平衡树复健题
测试地址:书架 做法:好久没做平衡树的题了,结果一道水题写了一晚上……唉…… 这一道题需要用到平衡树。 这一题可以按书的编号建点,然后给每个点附上一个优先值,那么按优先值从小到大排序就是当前书架上书的顺序了。题目中的几个操作就可以写成这样: Top和Bottom操作:将一个点的优先值赋成比当前所有点优先值都小(或者都大),然后重新插入该点。 Insert操作:将相邻两个点的优先值交换,然原创 2018-01-04 19:02:44 · 246 阅读 · 0 评论 -
【BZOJ2209】括号序列(JSOI2011)-Splay
测试地址:括号序列 做法:本题需要用到Splay。 对于任意一个括号序列,我们把配对的括号删掉之后,最后肯定是xxx个右括号紧接着yyy个左括号的形式,那么怎么样才能用最少的次数改正呢?首先显然x+yx+yx+y是偶数,如果xxx和yyy都是偶数,那么最少次数显然为x/2+y/2x/2+y/2x/2+y/2;如果xxx和yyy都是奇数,那么最少次数为x/2+y/2+2x/2+y/2+2x/2+...原创 2018-03-17 16:33:41 · 269 阅读 · 0 评论 -
【BZOJ2733】永无乡(HNOI2012)-平衡树启发式合并
测试地址:永无乡 做法:本题需要用到平衡树启发式合并。 题目要维护每个连通块的第kkk大,并且要支持合并。维护第kkk大我们知道可以用平衡树解决,但是平衡树的合并我们好像除了暴力就没有想法了。怎么样比较快地合并两棵平衡树?想法上非常简单,我们只需要暴力把点数比较小的那棵平衡树上的点一一插入到另一棵平衡树上。为什么这样就更优了呢?因为每次合并,新平衡树的大小必然是原小平衡树的两倍以上,那么每个元...原创 2018-03-11 18:15:37 · 321 阅读 · 0 评论 -
【BZOJ2212】Tree Rotations(POI2011)-平衡树启发式合并
测试地址:Tree Rotations 做法:本题需要用到平衡树启发式合并。 对于叶子节点,最优答案显然是000。然后对于每棵子树,我们发现由转换它的左右子树所多出的逆序对数,仅和两边都有什么数字有关,而不和两边的数字顺序有关,所以我们对于每个叶子节点存储一棵平衡树,然后在每个节点合并左右子树的平衡树,在合并的同时,算出新增的逆序对数,然后判断要不要转换子树,选择最小的答案累加即可。 以下是...原创 2018-03-11 21:13:21 · 283 阅读 · 0 评论