线段树
文章平均质量分 83
johsnows
正在静下心来学算法的acmer
展开
-
hdu 5316 Magician (线段树)
题意:给一个长度为n的序列,m个操作,操作有两种,1种是将a位置的数改为b,第2种是查询a到b位置的区间完美子段和,完美子段和要求相邻的两个数的位置的奇偶性不同。n,m范围都是【1,100000】, b的范围是【1000000000 ,1000000000】解题思路:线段树简单题查询次数过多肯定不能去暴力,需要用到线段树去维护。虽然是简单题但是弱渣还是做了蛮久。这个题的难点就是原创 2017-03-13 16:18:41 · 316 阅读 · 0 评论 -
hdu 5238 Calculator(线段树+中国剩余定理)
非常巧的一个题。运算过多,肯定得用数据结构维护一些东西,这里要维护的是映射关系,运算的本质其实就是函数,也就是映射。但是答案对29393取模,对0-29393的数维护映射在空间上和时间上都是撑不住的。如果仔细观察这个数可以发现,这个数本身不是素数,但是可以分解为4个素数的乘积7*13*17*19。如果你学过中国剩余定理,就应该知道已知一个数x对m1,m2,m原创 2017-07-29 08:20:00 · 399 阅读 · 0 评论 -
hdu 6133 Army Formations(线段树合并)
其实题目要求的就是一颗子树上把所有的权值从小到大排序,每个值对应第k大,把k和值乘在一起加和,就是这个子树对应的根的答案。说到底就是有多少个数大于一个值,这个值就要多加几次。然后我就死在这个理解上,因为要考虑值相同的情况,这句话没错,但是容易忽略值相同的情况。对于每个点我们建一颗权值线段树,表示以这个点为根的子树上的权值分部情况。然后右子树上有多少值大于左子树上的值,以及左子树上有原创 2017-08-20 17:26:35 · 522 阅读 · 0 评论 -
洛谷 排列LCS P1439 (LCS)
看到黑书上写着,LCS是稀疏匹配,只需要关注能让答案更新的地方就可以了。也就是当a[i]==b[j],dp[i+1][j+1]=dp[i][j]+1.这种情况。所以对于每一个i,我们只需要关心,和a[i]相等的值再b种的位置j,记为pair[i]。所以i从0开始更新,去找出pair[j]小于pair[i]的最大的dp[j],这个过程用个线段树或者树状数组优化就好原创 2017-07-27 09:38:21 · 411 阅读 · 0 评论 -
bzoj 2212 [Poi2011]Tree Rotations(线段树合并)
题意:一棵二叉树有n个叶子节点,每个叶子节点有权值,可以交换左右子树,问先序遍历这棵树,得到的最小逆序对数。思路:应该算是线段树合并的入门题。暴力每个非叶子节点,用ans1记录不交换左右子树时,跨越左子树和右子树的答案,即左子树大于右子树的数的对数,ans2记录交换左右子树时的答案。查询左子树中大于右子树的对数可以对左右子树各建一棵权值线段树,在线段树合原创 2017-08-18 22:16:56 · 331 阅读 · 0 评论 -
poj 2763 Housewife Wind(线段树+树剖)
将边的值转成深度大的端点的点值,然后就是树剖找lca通过dfs序把一条链的点映射到线段树上的区间去查询就好了。需要注意的一点是,传入线段树的是dfs序,但是线段数的操作不需要去管dfs序,直接根据传进来的参数做就行了,这是一个容易写错的地方。代码:#include #include #define MID int mid=(l+r)>>1;#define lson原创 2017-08-09 22:26:53 · 310 阅读 · 0 评论 -
codeforces 811 E Vladik and Entertaining Flags(线段树+并查集)
题意:n*m的矩形,每个格子上有一个数字代表颜色,有q次询问,问(1,l),(n,r)这两个点对应的矩形的连通块有多少个。1解题思路 :这题最麻烦的就是写合并了,然后也是让我对并查集又重新认识了一下。。只要往线段树那个方向想了,想到每个区间维护左右两个列应该不难,然后再想一想这个题目要求连通块个数,那么应该也能想到左右两个列应该是并查集。然后需要注意的是L(原创 2017-05-31 20:54:56 · 894 阅读 · 2 评论 -
poj 2750 Potted Flower(线段树)
题意:给出一个环,让找到一段连续区间,使得和最大,不能不取,也不能全取。解题思路:不是一个环的话,就是连续子段和的线段树简单题,不会可以看前面的博客:http://blog.csdn.net/johsnows/article/details/70214095然后求环的话,我一开始很蠢的去特判了一下,反正最后对拍出来错误也很难调试。看了金q的博客后原创 2017-06-14 16:52:22 · 347 阅读 · 0 评论 -
FZU 2105 位运算 (线段树)
由于各项数据范围都是0-15,所有把一个数拆成四位二进制数来维护,对应三种操作分别不同分别跑循环操作一下就可以。更新lazy的时候会比较麻烦。要注意如果你默认lazy操作为and, or, xor对应的lazy值分别为0,1,1(因为只有这些值会对结果产生影响),对xor对应的值直接异或的话,需要把异或后为0的lazy标记直接抹去。大概就是这样了,然后不要整个数组都memset原创 2017-07-05 17:58:40 · 408 阅读 · 0 评论 -
bzoj 2049: [Sdoi2008]Cave 洞穴勘测 (时间分治+带撤销并查集)
可加边删边,询问两个点连通性的一个题。好像可以lct。但是跟着金桔学了时间分治+带撤销并查集的做法,第一次写时间分治。时间分治的话就是以操作序号为时间,对应对一颗线段树上去,然后在线段树上分治找到操作时间对应的节点,进行操作。对于一条边,它存活的时间就是【加边的时间,删边的时间】这样一个区间,然后我们这条边pushdown到线段树上去,分散的存在各个节点,注原创 2017-06-16 10:57:43 · 1065 阅读 · 0 评论 -
poj 2886 Who Gets the Most Candies?(线段树+二分+反素数)
题意:n个小朋友围成一圈,每个小朋友有自己的名字以及一张卡片,卡片上的数字a代表在自己出列后想让自己右边第a个人下一个出列,如果a解题思路:暴力来的话是n^2的,由于n是5e5,所以肯定不行。我们可以用一个线段树维护一下区间内剩余的数的个数,然后我们通过转换a,把下一个要出列的人在当前剩下的序列里的编号求出来,然后我们去query这个编号在原序列上的位置,这时候就要二分一下原创 2017-05-29 23:54:20 · 333 阅读 · 0 评论 -
hdu 1698 Just a Hook(线段树)
三个区间覆盖操作的线段树题,蛮简单的,貌似我多写了一个query,不过写了就算了吧代码:#include #define lson o<<1#define rson o<<1|1using namespace std;const int maxn=1e5+5;int n;struct p{ int sum; int lazy;}a[maxn<<4]原创 2017-04-21 19:49:00 · 357 阅读 · 0 评论 -
uestc 1593 老司机破阵(线段树 or multiset)
老司机破阵Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)Submit Status老司机的女朋友被坏人抓起来了,护女票心切的老司机心急火燎的赶到坏人藏匿女票的地点想要救出她,但是老司机的神通广大坏人们早有耳闻,等老司机赶到时已经有一原创 2017-05-23 17:07:58 · 772 阅读 · 0 评论 -
hdu 5221 Occupation (树剖+线段树)
题意:一棵树每个点都有权值,有三种操作1 从x节点走到y节点,并将路径中的点的权值都取出来2 将x节点的权值减去3 将以x为根节点的子树的所有节点的值取出来。每次操作后查询一次现在取出来的值为多少。解题思路:入门树剖+线段树题吧第一次写树剖,写错了一个地方wa了好几发。 while(ty!=tx) { if(dee原创 2017-05-11 16:43:43 · 424 阅读 · 0 评论 -
hzau 1207 Candies(线段树 区间更新 区间查询)
题意:给出一段长度为n的字符串,只包好A和B,一个操作是把区间[l,r]内的字符都替换为A或B,一个询问是问区间[l,r]内最大的连续的B的长度。解题思路:线段树很明显,但是对我来说比较难写。这个题从恐惧于写lazy的过程,到发现自己对合并的理解不够深其实并没有那么可怕,到无限tle,认识到用build比对每个点更新快,再到发现区间合并的时候有个bug,并且区间合并写好了省原创 2017-04-28 21:13:16 · 401 阅读 · 0 评论 -
spoj 1716 Can you answer these queries III
和上回做的线段树几乎一样。http://blog.csdn.net/johsnows/article/details/62237377不过这回只能有单点更新的方法去做了代码:#include #define LL long long using namespace std;const int maxn=5e4+5;const int inf=10000;str原创 2017-04-17 17:46:04 · 334 阅读 · 0 评论 -
spoj Can you answer these queries I(线段树 单点更新 区间查询)
题意:给你一个序列,有m次查询,查询一个区间最大连续子序列和最大值。思路:之前做过一个最大连续子序列和的题,那个题有个分治的做法,在回溯的时候,区间最大连续子序列和的最大值只有三个可能,左区间的最大值,右区间的最大值,左区间从最右边开始到左边的最大连续子序列 和加上右区间从最左边开始到右边的最大连续子序列和。这个题也类似了,由于是区间查询,所以我们需要使用线段树去维护,相当原创 2017-03-15 21:07:15 · 465 阅读 · 0 评论 -
poj 2528 Mayor's posters(线段树)
Mayor's postersTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 62535 Accepted: 18059DescriptionThe citizens of Bytetown, AB, could not stand that the原创 2017-03-14 22:10:39 · 340 阅读 · 0 评论 -
hdu 6183 Color it(cdq分治+线段树)
题意:两种操作1:在x,y这个点上涂上颜色c。2:查询1,y1和x,y2组成的矩形包含多少种颜色。代码:矩形区域查询点,赛时直接把之前cdq分治+bit的代码贴上然后开了50个树状数组去做,时间复杂度是n*logn*logn*50,直接十几e的复杂度,tle,而且因为树状数组的logn和50是不随数据变的,所以跑起来还没有暴力快,然后暴力代码ac了。。。50原创 2017-09-01 11:31:27 · 844 阅读 · 0 评论