数据结构
文章平均质量分 76
glq007
muyou
展开
-
BZOJ 1483 [HNOI2009]梦幻布丁(启发式合并)
题意中文。做法:由于是同种颜色的改变颜色,所以只会有合并,不会有拆分,我们可以利用启发式合并,要合并2堆,就把小的那堆暴力合并给大的那堆,可以发觉,一个布丁最多只会被合并logn次,因为每次暴力合并后大小都会至少乘2。我写法比较暴力,用了vector保存不同颜色的布丁,用map保存某种颜色对应哪个vector。AC代码:#pragma comment(linker, "/STACK原创 2015-10-04 12:09:41 · 695 阅读 · 0 评论 -
HDU 5196 DZY Loves Inversions(离线+线段树)
题意:求[l,r]区间内的区间[i,j]逆序对等于k的有几个。做法其实并不难。。另rmi[i]代表以i为区间左边界,逆序对等于k的最小右边界,自然rma[i]就是代表最大右边界,因为逆序对对于区间具有单调性,所以可以利用树状数组求出这2个数组。。另外。k=0的时候得特殊对待,我之前想都当成一种情况发觉有点烦就特判了下。之后把询问离线,利用线段树先把所有点的[rmi,rma]区间加1,然后根原创 2015-03-30 20:15:38 · 576 阅读 · 0 评论 -
ZOJ 2112 Dynamic Rankings(线段树树套平衡树)
题意就是求区间第k大,不过有修改。其实这题解法挺多,主席树套BIT的我之后再写,这次写了线段树套平衡树的2种解法,第一种是按权值建线段树套treap,treap里放的是数的位置,这种方法必须要离线,因为需要把修改的值也一起建树,第二种则是在线的,按区间建线段树套treap,treap里放的是数的大小。第一种建树复杂度是o(log^2n),询问复杂度是o(log^2n)。修改复杂度o(log^2原创 2015-03-12 20:41:00 · 1005 阅读 · 0 评论 -
HDU 5195 DZY Loves Topological Sorting(线段树)
看题意以为是个拓扑排序。事实上,就是个线段树。因为最多可以删k条边, 所以就是在线段树里找入度小于等于k的最大值,那么保存个区间最小就ok了。如果右子树的区间最小小于等于k那么就往右边走,因为是要找字典序最大的。当k是0,也是这样找,就跟topological sort是一样的。然后删除一个点就在线段树那个点置最大值,再删除他的边。因为总共也就m条边不超过10^5。总复杂度o(n+m)logn原创 2015-03-29 00:12:49 · 1084 阅读 · 0 评论 -
ZOJ 2112 Dynamic Rankings(树状数组套主席树)
题意就是带修改的区间第K大,看了诸多大牛的博客才弄懂。原创 2015-03-16 23:46:39 · 936 阅读 · 0 评论 -
HDU 3887 Counting Offspring(dfs序的应用)
题意:给你一棵树,每个节点有个标号,求树上每个节点其子树中有多少个节点标号比自己小。做法我想了半天,知道可以用树状数组统计,但是如果删除影响想了好久。。看了题解才知道原来怎么简单,根本不需要删除其他点的影响,直接在遍历自己下面子树之前统计一下,遍历后再统计一下,相减就是子树里的。脑子还是太榆木了。另外因为树比较大,不扩栈的话可以用栈模拟。AC代码:#pragma comment(l原创 2015-03-05 22:14:33 · 587 阅读 · 0 评论 -
poj 2104 && 2761 Feed the dogs(划分树)
非常经典的题,为了学习下划分树,之后还要学习下主席树,2104其实是2761的简化,因为没有重复的数字,这个对于划分树来说是一个很大的不同,然后2761中说每个区间没有包含关系,所以可以排序询问后用二分答案+线段树(或树状数组),因为可以暴力删除之前加的点,加上现在的点,但是划分树不需要这个特殊条件。划分树的原理其实相当简单,以中位数划分,小于等于中位数的放左边,大于的放右边,放的时候不改变数原创 2015-03-04 21:29:47 · 666 阅读 · 0 评论 -
POJ 1741 Tree(树上的点分治)
题意:一棵树,边上有权值,求2点之间距离小于等于k的对数。很经典的点分治问题,理解后思路比较清晰,点对分为3种情况,第1种是在子树中,这就是分治递归的过程。第2种就是子树里的点到根节点距离小于等于k的点,第3种是一个子树里的点到另一个子树的点小于等于k。这个做法就是把点到根节点的距离从小到大进行排序,然后用一个指针j指向末尾,如果第i个跟第j个和大于k,那么i之后的跟j之和肯定也大于k,所以要原创 2015-03-03 23:14:57 · 740 阅读 · 0 评论 -
HDU 5192 Building Blocks Ⅱ(树状数组)
题意就略了。先做完BC的B再做这个就比较好理解了,还是基本一样的想法,但是那个h就不确定了,要求是大于等于给定的H。对于一个区间,消耗的价值等于max(大于h减h的和,h减小于h的和),所以可以发现当h取这个区间所有楼高度的平均值的时候,这个消耗是最小的。那么思路就来了,要维护一下区间高度小于等于x楼的个数,以及区间里高度小于等于x楼的总和,这样在算出平均高度h后,就可以顺利的算出max(原创 2015-03-25 14:26:40 · 577 阅读 · 0 评论 -
UVA 11922 Permutation Transformer(splay)
第一道splay,仔细看了大白书上的内容后并不难,就是想记录一个大白书没有说清楚的地方。就是为什么把第k个节点伸展到根节点要分3种情况?应该跟我一样想过,不就是一种情况?反正是树,那个节点到根节点就只有一条路,不停的往上翻转不就行了。的确,这样也可以达成目的,这样跟那3种情况的差别就在于第二种,3点共线的时候,他是先翻转x的父节点,再翻转x,而我们则是想翻转2次x。精髓就在于这张图原创 2015-02-12 23:08:07 · 685 阅读 · 0 评论 -
UVA 11983 Weird Advertisement(线段树扫描线)
题意就是给你一些矩形要求被覆盖大于等于k的面积和。做法和矩阵面积并类似。时间维护x轴,线段树维护y轴。用线段作为叶节点,每个节点要保存3样东西,这个线段的真实长度,len[i]代表这个线段上被覆盖i次的长度,flag代表扫到x的这个位置这个线段的矩形有几个还在覆盖,矩形左边边进去flag就+1,右边进去flag就-1。容易写错的地方就在更新的pushup操作。如果这个节点的flag大于k了,那原创 2015-02-10 18:45:42 · 648 阅读 · 0 评论 -
UVALive 5031 Graph and Queries(离线,treap)
看训练指南做的这道题,参考了书上的代码,不过还是说一些自己的一点理解。首先为何要离线弄?为什么不能按顺序来,这里书上没有讲,其实并不难想,主要在于,首先一个联通块要用一个名次树,然后删除一条边的话可能变成2个联通块,但是又可能还是联通的,这里的判断并不容易得到(而且还要用到树的分裂)。但是反过来操作,那么是加边,这里可以用并查集很容易的知道在加边之前是否就属于一个联通块,如果不属于才需要合并2原创 2015-02-10 18:19:31 · 685 阅读 · 0 评论 -
UVA 11996 Jewel Magic(伸展树+字符串hash)
大白书例题。4种操作,插入操作可以像普通的排序二叉树那样插入,也可以利用2次伸展操作把第k-1个伸展到根节点,以及把根节点的右子树中的第一个伸展到根节点右子树节点,再把要插入的节点插入到右子树的左子树。删除操作也可以像刚才一样,先把第k-1个伸展到根,再把右子树中第2个伸展到右子树处,这样右子树的左子树就是要删除的节点。反转操作是通过类似刚才的操作提取那一段,再把这一段的左右子树交换,原创 2015-02-16 23:41:25 · 595 阅读 · 0 评论 -
HDU 5193 Go to movies Ⅱ(块状数组套树状数组)
题意:一群人站一排,身高各不同,有加入人以及删除人操作,求全部人的逆序数。用块状数组去维护下下标,每个块里用个树状数组去维护下大小,这里有个关键的问题就是因为有加入和删除操作,那么一个块里的东西可能会变没有或者超出范围,不光内存开不下,效率也会非常低。所以就需要重构。假设一个块的大小为s,那么在加入或删除的那个块里就直接暴力移动元素以及计算之前大于他之后小于他的,对于其他块来说直接利用树状数组原创 2015-04-03 00:51:42 · 652 阅读 · 0 评论 -
CodeForces 17E Palisection(manacher算法+递推)
题意:给你一个长度为n的序列,问你有多少相交的回文串。做法:可知求相交的比较难,但是求不相交的却很简单,先用manacher算法o(n)的求出每个点的回文串最长有多长。再求出start,end数组,分别代表以i为开头的回文串有几个,以i为结尾的回文串有几个。这可以利用标记再加上前缀和求,最后要求的不相交个数是:sum( start[j] * sum(end[i]| 1PS:因为n高达2*1原创 2015-04-07 21:44:29 · 1449 阅读 · 1 评论 -
BZOJ 3196 Tyvj 1730 二逼平衡树(线段树套treap)
题意中文。其实这题之前就做了。不过当时忘了写博客了。。做法:权值线段树套位置treap操作1:线段树上往k权值的方向走,如果往右子树走,那么要统计左子树上在区间[L,R]上的数字个数。求和即可。操作2:经典问题,查左子树在区间[L,R]上有几个数字,小于等于k就往左走,反之,往右走,走到底就是答案。操作3:在权值小于k的情形下尽量往右边走,不过因为靠的是左(右)子树在区间[L,原创 2015-04-13 18:36:35 · 661 阅读 · 0 评论 -
hdu 5267 pog loves szh IV(点分治+线段树)
好久之前写的题了。现在要重新开始写题解了。就从这题开始吧。题意:一棵树,两点之间的权值为路径上的值异或得到,求任意两点之间的权值和,有修改操作,每次都要输出任意两点间的权值和。做法:当时写这题写了好久。就说下一些关键的思路,因为细节部分真的是太多。首先不同的位独立考虑,然后任意两点我们肯定会想到点分治,点分治时会dfs求出子树里每个点到根节点的权值,然后进行配对求经过根节点的权值和。那原创 2015-08-07 01:40:27 · 698 阅读 · 0 评论 -
hdu 5367 digger(线段树)
题意:连续大小一样的数被称为山,必须在它的左边和右边都有比它矮的山时,它被称为高山,给出q个操作,操作是把区间都加上一个数,输出全部高山的总长度。做法:线段树,维护下这个区间是否是同一个值(same),是的话同一个大小是多少(val),如果不是同一个值,最左边值大小为多少(zv),右边值大小(yv),以及最左边为sv的连续长度(zsz),右边(ysz),以及最左边的值是不是“半个”山峰(右边值原创 2015-08-26 13:49:10 · 784 阅读 · 0 评论 -
hdu 5420 Victor and Proposition(强连通+线段树建图)
题意:给出一棵树,每个点都给一个x,d,代表它和x这个点以及以下深度差小于d的点都有一条有向边,求互相可达的u,v对数。做法:可以很容易发觉如果我们把点连好然后直接找强连通分量,然后答案就是每个强连通分量大小x*(x-1)/2之和。但是因为点有10000个,边极限可以出到n^2个的。所以我们得简化边的个数。先处理出dfs序,保存一下每个点子树的dfs序范围,可以发现,x以及它之下深度小于d原创 2015-08-25 03:13:43 · 1245 阅读 · 0 评论 -
hdu 5238 Calculator(线段树+CRT)
题意:有加,乘,次方3种运算,初始值为x,给定运算式,2种操作,第一种:告诉你x的值,求答案模29393。第二种:更改某个位置的运算。做法:乍一看就像线段树,但是那个操作并不能简单的合并,所以我们得另寻他法。可以发觉29393并不是质数,29393 = 7×13×17×19.我们对其中因子做线段树,线段树只需要简单的算出对于每个小于质因子的数经过这个区间答案是几即可,最后利用中国剩余定理对原创 2015-06-11 17:40:22 · 888 阅读 · 0 评论 -
CodeForces - 548D Mike and Feet(单调栈)
题意:给出n个数,假设区间长度为k,给定一个起点求区间最小值,由于有很多起点,所以要求的是这些的最大值。然后k的范围是1-n。。(感觉好别扭)。所以要输出n个答案。做法:我们都知道单调栈可以处理出一个数为最小值的最长区间,那么先处理出这个东西。再把数字带着他的最长区间降序排个序。设指针p为1,我们可以发觉对于区间长度从小到大来说答案是不增的,所以如果当前数字最长区间为x,那么我们只需要更新p到原创 2015-05-27 23:52:06 · 883 阅读 · 0 评论 -
BZOJ 2565 最长双回文串(manacher)
题意:求一个最长的双回文串,双回文串定义是两个回文串是连续的但是不相交。做法:manacher预处理一下。然后用h1[i]代表以i为结尾的最长回文串,h2[i]代表以i为起点的最长回文串。我这里用了一个单调队列,因为对于一个点来说,作为结尾想要最长,那么自然希望最远的中点,所以维护一个位置单调递增,右边界也单调递增的单调队列即可。正过来做一次反过来做一次就可以了。后来发觉太沙茶了,其实完全原创 2015-05-20 14:55:08 · 556 阅读 · 0 评论 -
hdu 5217 Brackets(线段树)
题意:给一串括号,有2个操作,1。翻转某个括号。2。查询某段区间内未匹配的括号(或者说跟他匹配的在区间外面),第k个未匹配的括号是第几个。做法:我们可以把一段区间的括号匹配情况总结为)(,即左边的右括号和右边的左括号,其余的自然都已经匹配了,这样就可以利用线段树去合并。对于操作1单点更新即可。操作2就麻烦很多了。我YY了一个做法,把这个区间有关的点(也就是线段树内区间查询的点)给拿出来,重新建原创 2015-05-08 11:06:25 · 776 阅读 · 0 评论 -
hdu 5213 Lucky(容斥+莫队)
题意:给2个区间,从2个区间内各取一个数字,求a_i+a_j = k的对数。做法:假设区间范围是[x1,y1]和[x2,y2],我们设f(a,b)为区间a,b中等于k的对数总数,那么答案就是f(x1,y2)-f(x1,x2-1)-f(y1+1,x2)+f(y1+1,x2-1)。那么该如何求f(a,b)?还记得小z的袜子么,我们只需要改变下思路对于a来说求k-a的个数即可。。PS:第一次离4原创 2015-04-27 23:54:17 · 701 阅读 · 0 评论 -
HDU 4348 To the moon(主席树区间更新)
题意:有几个操作,区间加个数,查询区间和,查询历史区间和,时间回退到过去某个时间,不能再回来。做法:此题有很简单的离线做法,先保存每个时间点的询问,再利用一个栈,用普通线段树即可,更新一下就把更新的区间L,R,D放进栈,碰到回退操作的时候,先把所有这个时间点的询问给算出,再通过出栈做减法。因为回到过去后不能回到将来,所以这样做是没问题的。在线做法就是利用主席树了。区间更新的时候必须要延迟更原创 2015-04-17 23:51:45 · 2072 阅读 · 0 评论 -
CodeForces 30E Tricky and Clever Password(hash+manacher)
题意:把一个回文串拆成prefix, middle, suffix三部分,中间那部分必须得是奇数,prefix与suffix对称并且长度可为0,把这3部分放进一个串中,成为A+prefix+B+middle+C+suffix,要使回文串最长,输出分界的位置。做法:首先求出以小于等于i为结尾的prefix能匹配的最长suffix是多长,可以看出当左边界匹配成功,就移动右边界,符合单调性。原创 2015-04-10 00:24:45 · 2584 阅读 · 0 评论 -
HDU 3613 Best Reward(扩展KMP)
题意:每个字母有一个权值,要把一个字符串分为2部分(都非空),只有这部分是回文串才能算权值,问权值和最大是多少。做法:这题比较简单,用manacher算出每个点为中心的最大回文串长度,必须延伸到两端才是有用的。不过学习了下扩展KMP。学习资料:http://www.cnblogs.com/Rlemon/archive/2013/06/26/3157574.html思想其实跟manach原创 2015-04-15 15:40:19 · 768 阅读 · 0 评论 -
HDU 3948 The Number of Palindromes(后缀数组)
题意:求一个串中不相同回文子串的个数。做法:本来想用manacher。但是无法判重。只能利用后缀数组,按照求回文串常规做法,把原串翻转拼到原串后面,求出height,以及利用sparse table预处理。通过rank值的从小到大枚举回文串的中点(这里就说奇回文串,偶的大同小异),同时要保存之前算出的回文串长度(其实中心到右端)L,L = min(L, height[i])是当前求出回文串长度原创 2015-04-13 16:01:47 · 624 阅读 · 0 评论 -
HDU 5141 LIS again(dp+线段树)
题意:给一串数,[i,j]这个区间的lis长度等于这串数的lis长度,问你这样的区间有几个。思路不难想,dp[i][0]代表以i为结尾的lis长度,dp[i][1]代表能达到这个lis长度最右边的起点是哪个。那么这个可以用线段树去优化完成,按值建立线段树,找小于当前数区间的lis长度最大值,最大值相同就找最右边起点的。然后这个算完就可以开始递推答案了。假设对于以j结尾的区间[i,j]是最短原创 2014-12-12 00:45:47 · 1302 阅读 · 0 评论 -
HDU 5107 K-short Problem(线段树,离线)
题意就是给出一些坐标和楼原创 2014-11-24 15:27:28 · 832 阅读 · 0 评论 -
HDU 4973 A simple simulation problem.(线段树)
比赛的时候傻了,延迟更新的标记竟然没有下传,ran原创 2014-08-21 21:44:48 · 680 阅读 · 0 评论 -
UVAlive 5798 Jupiter Atacks!(树状数组)
题意是求H( fi,..., fj) = Bkfj-k ( mod P)原创 2014-09-05 15:30:22 · 977 阅读 · 0 评论 -
HDU 4970 Killing Monsters(扫描线)
比赛的时候没仔细考虑,看了题目就直接上线段树,不出所料TLE,许久后原创 2014-08-20 14:07:18 · 583 阅读 · 0 评论 -
UVALIVE 4329 Ping pong(树状数组)
题意:N个乒乓球爱好者,meichang原创 2014-08-06 22:02:32 · 875 阅读 · 0 评论 -
HDU 4879 ZCC loves march(并查集+set)
题意:一个最大10^18*10^18的矩阵,给你最多十万个士兵的位置,分别分布在矩阵里,可能会位置重复,然后有2种操作,一种是把第i个士兵向上下左右移动,另一种是把第i个士兵与他横坐标纵坐标相同的士兵全部移到这个点上,然后要计算花费。这道题我想了好几天。在看了标程得到一些提示后总算写出来了。加了读入优化后快了100ms左右达到546ms。做法:开2个set分别维护X相同的和Y相同的,但是会原创 2014-08-06 15:42:35 · 1240 阅读 · 0 评论 -
HDU 1754 I Hate It(区间最值)
题目很简单就是用线段树维护区间最值。原创 2014-07-30 18:05:18 · 566 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers(线段树区间修改)
题意就是说一定区间的数会一起修改原创 2014-07-30 20:50:52 · 642 阅读 · 0 评论 -
HDU 1166 敌兵布阵(线段树区间和)
题目大意:给N个点qi原创 2014-07-29 21:48:30 · 595 阅读 · 0 评论 -
poj 2299Ultra-QuickSort(归并排序)
这题在刘汝佳白书上有一模一样的题,前几天看的,原创 2014-05-06 00:12:44 · 817 阅读 · 0 评论 -
uva 548 - Tree
这道是道基础的二叉树题目,可以说帮我好好巩固了二叉树递归遍历的思想,有个地方要注意,就是路径和的最小值一开始初始化一定要足够大,不然会WA,因为一个节点的数字大小最大就有1万了。这个地方一定要注意。还有就是解题的关键就是,当p=0且n-p-1=0时就到叶节点了,其实就是n=1,p=0的时候,写的谨慎点就是p#include#include#include#include#includeu原创 2014-03-26 23:20:27 · 900 阅读 · 0 评论