![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线段树和树状数组
文章平均质量分 50
_pkm_
love coding
展开
-
线段树
【完全版】线段树很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要给集训队讲解线段树,所以决定把这些题目重新写一遍,顺便把近年我接触到的一些新题更新上去~转载 2014-10-31 21:39:58 · 473 阅读 · 0 评论 -
HDU5726 (线段树+暴力)
题目链接 第一问是没有修改的线段树,第二问暴力预处理,因为gcd的结果不会很多#include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define LL long long#define pb push_back#define gcd __gcdconst int maxn = 1e原创 2016-07-21 10:01:24 · 1166 阅读 · 0 评论 -
HIHO #1077 : RMQ问题再临-线段树
题目链接 线段树入门,单点修改,区间查询 线段树的空间一般开题目数据范围4倍#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<queue>#include<map>#include<set>#include<原创 2016-08-10 07:36:41 · 470 阅读 · 0 评论 -
HIHO #1078 : 线段树的区间修改
题目链接 线段树区间修改,使用懒惰标记,向下更新,向上更新#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<queue>#include<map>#include<set>#include<cstdlib>#原创 2016-08-10 08:27:59 · 258 阅读 · 0 评论 -
HIHO #1079 : 离散化(线段树+离散化)
题目链接 在线段树的通常用法中,线段树的节点是有2种不同的意义的,一种是离散型的,比如在Hiho一下 第二十周中,一个节点虽然描述的是一个区间[3, 9],但是实际上这样一个区间是{3, 4, 5, 6, 7, 8, 9}这样的意义。而另一种就是连续型的,比如就在这一周的问题中,一个节点如果描述的是一个区间[3, 9],它就确确实实描述的是在数轴上从3这个标记到9这个标记的这一段。 那原创 2016-08-10 15:50:03 · 488 阅读 · 0 评论 -
HDU 3966 Aragorn's Story(树链剖分 点权,树状数组)
题目链接 题意:给出一棵树,每次把路径(u,v)上的点权都加上或者减去一个值,然后问某一点的值。 树链剖分,后面可以使用线段树,也可以使用树状数组。使用树状数组的话,因为是点权,要移到边权上,所以pos初始为1。树状数组,使用了区间的更新,单点查询。 具体的过程是初始化 add(i,x),add(i+1,-x) 这样sum(x)就是x点的值了。而不会是x的前缀和了//#include<bits原创 2016-10-26 18:35:09 · 304 阅读 · 0 评论 -
HIHO #1080 : 更为复杂的买卖房屋姿势(线段树双标记)
题目链接两种操作, 0)区间加减,记add标记 1)区间设置为某一个值,记set标记使用2个懒惰标记,然后注意的是,2个操作的优先级,也就是下放节点的标记的时候,注意先检查set标记,因为set是会覆盖掉区间的加减操作的。#include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#defi原创 2016-08-10 21:18:15 · 426 阅读 · 0 评论 -
CDOJ1259 昊昊爱运动 II (线段树+bitset)
题目链接 使用bitset保存每一段区间的不同的数的数量,线段树节点,存bitset,bitset可以使用二进制位运算#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<iostream>#include<bitset>using namespace原创 2016-04-15 11:28:09 · 507 阅读 · 0 评论 -
POJ 2528 Mayor's posters (线段树+离散化处理)
D - Mayor's postersTime Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64uSubmit Status Practice POJ 2528DescriptionThe citizens of Bytetown, AB, could not stand that the candid原创 2015-04-04 16:34:35 · 571 阅读 · 0 评论 -
ZOJ 1610 Count the Colors (线段树+结点为长度为一的区间+树的遍历)
F - Count the ColorsTime Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %lluSubmit Status Practice ZOJ 1610DescriptionPainting some colored segments on a line, some previously pain原创 2015-04-06 18:10:28 · 669 阅读 · 0 评论 -
HDU 3887 Counting Offspring(dfs序+树状数组)
题目链接 题意:给你一颗有n个节点的n-1边的树,以及树的根节点是p,问你是不是这个树,每个节点子节点中比这个节点的号码小的个数。 trick:注意根节点是题目给出的,所以加边的时候反方向边也是要加入的,接着就是dfs序的时候是要注意,由于反向边的存在,那么我们就要判断下。#include<bits/stdc++.h>using namespace std;#define LL long l原创 2016-03-31 15:41:13 · 374 阅读 · 0 评论 -
HDU 3974 Assign the task (线段树+dfs序)
J - Assign the taskTime Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uSubmit Status Practice HDU 3974DescriptionThere is a company that has N employees(numbered from 1 to N),e原创 2015-04-09 21:41:32 · 606 阅读 · 0 评论 -
HDU 5775 (Bubble Sort 逆序数)
题目链接 意思是告诉你一个冒泡排序,在整个排序的过程中问你每个数出现最左与最右的位置差其实就是求每个数后面有几个比他小的,因为后面小的排序会移到他前面,用树状数组写一下就可以了#include<cstdio>#include<algorithm>#include<iostream>#include<vector>#include<queue>#include<cstring>#incl原创 2016-07-29 16:20:57 · 427 阅读 · 0 评论 -
zoj3772 Calculate the Function(矩阵+线段树)
题目链接 题意 :给出一个函数 在区间[L,R] F(x) = a[x]; F(x+1) = a[x+1] F(k) = F(k-1)+F(k-2)*a[k] {x+2<=k<=R} 解法:转换为矩阵 1 a[k] f(x-1) a 0 乘以 f(x-2) #include<bits/stdc++.h>using namespace st原创 2016-04-13 16:29:33 · 375 阅读 · 0 评论 -
C - A Simple Problem with Integers POJ 3468(线段树+延迟标记)
C - A Simple Problem with IntegersTime Limit:5000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I64uSubmit Status Practice POJ 3468DescriptionYou have N integers, A1, A2, ... , AN. You原创 2015-04-03 22:29:19 · 595 阅读 · 0 评论 -
1546: 数牌 (线段树+交换位置)
1546: 数牌Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 31 Solved: 6[Submit][Status][Web Board]Description从西安到杭州的火车实在是太漫长了,为了打发时间,zjc买了n张扑克牌 (一张一张卖的你们没见过吧¯▽¯)牌的位置为1,2,3,…,n ,牌面大小为 3....,9,10,J原创 2015-04-02 12:48:21 · 811 阅读 · 0 评论 -
B - I Hate It HDU 1754 (线段树+区间)
B - I Hate ItTime Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uSubmit Status Practice HDU 1754Description很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。不管你喜不喜欢,现在原创 2015-04-02 16:21:30 · 568 阅读 · 0 评论 -
E - Just a Hook HDU 1698 (线段树+类似延迟标记)
E - Just a HookTime Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uSubmit Status PracticeDescriptionIn the game of DotA, Pudge’s meat hook is actually the most horrible thing原创 2015-04-04 18:20:01 · 585 阅读 · 0 评论 -
H - Can you answer these queries? HDU 4027 (线段树+延迟标记+开根号的速度)
H - Can you answer these queries?Time Limit:2000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64uSubmit Status Practice HDU 4027DescriptionA lot of battleships of evil are arranged in a原创 2015-04-06 21:29:04 · 773 阅读 · 0 评论 -
G - Balanced Lineup POJ 3264 (线段树+区间查询无更新)
G - Balanced LineupTime Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64uSubmit Status Practice POJ 3264DescriptionFor the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000原创 2015-04-06 19:04:51 · 481 阅读 · 0 评论 -
I - Tunnel Warfare HDU 1540(线段树+最大的连续区间)
I - Tunnel WarfareTime Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uSubmit Status Practice HDU 1540DescriptionDuring the War of Resistance Against Japan, tunnel warfare was原创 2015-04-09 14:24:47 · 582 阅读 · 0 评论 -
A - 敌兵布阵 (线段树)hdu 1166
A - 敌兵布阵Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uSubmit Status Practice HDU 1166DescriptionC国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Dere原创 2015-04-04 14:07:08 · 412 阅读 · 0 评论 -
ZOJ 3911 Prime Query(线段树区间操作)
题意:给你一个序列,有三种操作A v i操作:把数组下标是i的位置元素加上vR v,l,r操作:把区间[L,R]范围都变为vQ,L,R操作:查询区间[L,R]范围的素数个数 思路:先用筛法把素数打表,然后线段树,区间操作,用延迟标记#include<cstdio>#include<algorithm>#include<set>using namespace std;#define原创 2015-10-12 09:34:51 · 781 阅读 · 3 评论 -
HDU5592 ZYB's Premutation(树状数组)
题目链接 题意:给出一个排列的每个位置的逆序数,让你恢复这个排列 解法:首先可以发现的是a[i]-a[i-1]就是表示1到i位置中比i位置大的数的个数,这样第一步可以确定的是最后那个位置的数,考虑倒数的第二个数,n个数,用掉了一个,还有n-1个,假设这个位置前面比他大的有X个,怎么找到前面比他大的有X的数呢。反过来思考下,可以找前面比他小的数n-1-X个,依次类推,这样可以用树状数组维护,二分即原创 2015-12-10 16:10:46 · 461 阅读 · 0 评论 -
CF A. Greg and Array (区间离线处理)
题目连接 题意:给你n,m,k;给你n个数,m个形如l,r,d的操作,表示在[l,r]是每一个元素增加d。k个形如x,y,表示执行上面的x到y的操作,问最后数组的样子。 解法:参考qsc,区间的离线处理。用数组t表示每次操作从当前位置到最右边的次数,然后就好办了#include<bits/stdc++.h>using namespace std;#define LL long long#d原创 2016-04-08 16:48:39 · 588 阅读 · 0 评论 -
POJ 3321 Apple Tree(dfs序+树状数组)
题目链接 题意:就是给你一个树,每次动态修改一个节点的值,然后问你某一颗子树的节点值的和。 做法:很明显每次修改然后dfs一次是会超时的,所以先跑一遍dfs,给树映射到区间,然后树状数组求和,dfs序,就是每次记录访问到这个节点的时间戳以及访问其儿子节点结束后返回该点的结束时间戳,那么他的儿子节点就是在这2个时间戳之间了,就把树转换为区间了,剩下的就好办了。vector会TLE,所以使用结构存储原创 2016-03-30 17:54:21 · 364 阅读 · 0 评论