![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
>树状数组&&线段树<
文章平均质量分 84
DT2131
Rage, rage against the dying of the light.Do not go gentle into that good night.
展开
-
HDU 5371 Hotaru's problem (manacher+线段树)
题意:假设对于字符串A,它的反串为A'。给出一个字符串,找出形式为AA'A的最长串的长度。思路:先用manacher跑一边,得到对于每一个位置i,以i为中心回文串的长度Mp[i]以回文串AA'的中心i1为圆心,以AA'的半径Mp[i1]为半径,做圆O1 以回文串A'A的中心i2为圆心,以A'A的半径Mp[i2]为半径,做圆O2若要满足连续的AA'A必有原创 2016-12-05 16:40:21 · 371 阅读 · 0 评论 -
POJ 2887 Big String (线段树解法)
转自:http://blog.csdn.net/xuanandting/article/details/50528582题意: 大概意思为给出一字符串,然后有两种操作,在某个位置后面插入某个字符,查询更新后字符串中某个位置的字符。思路: 先倒序处理插入,然后正序处理查询,用线段树去更新和维护区间和,这样就可以了。代码:#include#include#include转载 2017-03-08 23:35:10 · 395 阅读 · 0 评论 -
HDU 4614 Vases and Flowers 线段树
题意: 见后文翻译。思路: 线段树,查询区间和,修改区间和。根据数据量要求,需要加入 lazy 。 可插入处标记为 1 ,否则为 0 。代码:#include using namespace std;#define ls l,mid,rt*2#define rs mid+1,r,rt*2+1#define mi (l+r)原创 2017-04-12 13:09:02 · 291 阅读 · 0 评论 -
HDU 4819 Mosaic (二维线段树)
题意: 二维线段树,查询区间最大最小值,修改单点。思路: 树套树,树和树间各写各的操作,注意conbine(自下而上的结合)和trans(自上而下的连接)即可。代码:#include using namespace std;#define ls l,mid,rt*2,id#define rs mid+1,r,rt*2+1,id#d原创 2017-04-12 12:40:20 · 333 阅读 · 0 评论 -
HDU 4456 Crowd (二维树状数组 + HASH)
题意:给定一个N*N的网格,现在M组操作,一种操作时改变网格上的某个单点的权值,另外一种操作是求到一点曼哈顿距离为小于等于k的所有的权值和,初始化网格所有点的权值为0。思路:裸二维线段树或树状数组,但是考虑到数据量,不可能建树,故采用树状数组带 hash 的思路做。树状数组求区间和,需要利用容斥的思想,在二维中也是如此。代码:#include #include #inc原创 2017-04-14 11:34:38 · 391 阅读 · 0 评论 -
CodeForces 339D Xenia and Bit Operations (线段树水题)
题意: 给出一棵完全二叉树,从叶子到根,每层做 OR 和 XOR 的交替运算。 问每次修改叶子后根的值。思路: 再简单不过的线段树。代码:#include using namespace std;#define ls l,mid,rt*2#define rs mid+1,r,rt*2+1#define mi (l+r原创 2017-04-23 00:48:14 · 678 阅读 · 0 评论 -
HDU 5517 Triple (线段树)
题意: 有二元组(a,b),三元组(c,d,e)。当b == e时它们能构成(a,c,d)。 然后,当不存在(u,v,w)!=(a,b,c)且u>=a,v>=b,w>=c时,则是一个better集合里的元素。 问这个better集合有几个元素思路: 注意到数据范围 对于 N 个二元组(a,b),原创 2017-06-18 10:50:53 · 276 阅读 · 0 评论 -
HDU 5975 Aninteresting game ( lowbit理解 )
题意: 已知对于任意的 X ,将其本身填入集合时,也需要将 [ x - lowbit(x) + 1 , x - 1] 重新填入集合。 给出 X 的最大值 N 和询问次数 K 共有两类询问 1.询问将 [ L , R ] 中所有数逐次填入集合时,一共对每个数字填入了多少次。 2.询原创 2017-06-08 16:44:17 · 502 阅读 · 1 评论 -
POJ 3468 A Simple Problem with Integers (线段树区间修改查询)
题意: N个数,M次操作。每次操作 Q X Y 代表查询 X 到 Y 的区间和, C X Y Z 代表将区间 X 到 Y 中的所有数加 Z思路: 线段树区间修改,查询。代码:#include #include #include using namespace std;#define ls rt*2,l,mid#define rs原创 2017-01-17 11:52:02 · 281 阅读 · 0 评论 -
HDU 1754 I Hate It (单点修改,区间查询
思路:建线段树查询,修改的同时维护段的最大值#include #include using namespace std;const int MAXN=2e6+7;int a[MAXN],p;typedef struct Node{ int left; int right; int mid(){ return (left+right)/2;原创 2016-09-21 21:44:07 · 355 阅读 · 0 评论 -
NEFU 1212 还是序列求和(线段树)
题意:中文思路:线段树裸题,注意不同标记覆盖的问题代码:#include #include #include using namespace std;#define ls l,mid,rt*2#define rs mid+1,r,rt*2+1#define mi (l+r)/2const int MAXN=1e5+7;int n,m;int add[MAXN*原创 2017-12-09 00:43:32 · 352 阅读 · 0 评论 -
NEFU 1266 快乐的雨季 (线段树)
题意:中文思路:线段树基础题当然亦可以分块做代码:线段树:#include using namespace std;#define ls l,mid,rt*2#define rs mid+1,r,rt*2+1#define mi (l+r)/2const int MAXN=1e5+7;int n,m;long long sum[MAXN*4];int laz原创 2017-12-10 20:29:21 · 325 阅读 · 0 评论 -
HDU 4027 Can you answer these queries? (线段树变着花样让你区间更新)
题意:给一个数组序列, 数组长度为100000,现在有两种操作, 一种操作是将某一个固定区间所有数开方(向下取整),另一种操作是询问某个区间的所有数字之和。坑点:区间的左右不是按顺序给的(RE的原因)思路:单点更新到子叶节点肯定药丸 1e5*1e5(TLE的原因)。所以考虑使用区间更新。这个题的更新操作是对子叶节点开方,而子叶节点的最小值是1。就是说区间的最小值就是righ原创 2016-09-28 14:10:49 · 347 阅读 · 0 评论 -
CodeForces - 272C Dima and Staircase (线段树区间更新)
题意: 见以下样例,给出 5 个区间,每个区间的高度已知。一共 4 次操作。每次操作都是从最左边开始向下垒一个宽为 w 高为h 的木块,过程见下图。 问每次垒木块的高度是多少?Input51 2 3 6 641 13 11 14 3Output1346InputThe fi原创 2017-01-24 13:46:47 · 396 阅读 · 0 评论 -
HDU 1556 Color the ball (只做区间更新)
思路:本题只做区间更新,而不查询。方法很多,线段树是大才小用,代码长不说,在线地维护区间会TLE。故离线之。线段树的做法:#include using namespace std;const int MAXN=100000+1000;int st,en,tree[3*MAXN],ans[MAXN],ppp;void update(int l,int r,int rt){原创 2016-10-10 11:38:16 · 490 阅读 · 0 评论 -
POJ 3667 Hotel 线段树区间合并
题意:模拟订房系统。给出N,M。代表房间数和操作次数。每组操作中 1 表示入住 k 间连续房间,要求安排的房间连续且在最左边,如果能入住输出最左边的房号,不能则 -1.2 表示退从第K 间房起连续的P间房。思路:先查找最左端的房子,当左区间的房间的最大连续小于要求时(即查找到最左端)返回,返回后通过区间合并判断是否满足题意。代码:#include #include原创 2016-11-15 21:33:44 · 335 阅读 · 0 评论 -
HDU 3308 LCIS(线段树区间合并)
题意:U X Y : 更新X位置为YQ X Y : 查询【X,Y】区间的最长连续严格上升序列的长度思路:本题做区间合并有四种情况:1.只有左区间在【X,Y】中2.只有右区间在【X,Y】中3.左右区间都在【X,Y】中,但合并后,左区间的右端点和右区间的左端点结合不能产生新的连续段4.左右区间都在【X,Y】中,合并后,左区间的右端点和右区间的左端点结合能产生新的连续原创 2016-11-06 16:29:00 · 389 阅读 · 0 评论 -
POJ 3067 Japan (树状数组求逆序对)
题意:首先一行是T组数据,每组数据第一行是N,M,K,N代表左侧点的数量,M代表右侧点的数量,K代表有K条连线次下K行有两个值X,Y代表左边第X和右边第Y个点相连。问这些连线最多有几个交点。(同起点的线不相交)原创 2016-11-06 16:07:11 · 300 阅读 · 0 评论 -
CodeForces 733C Epidemic in Monstropolis 暴搜+树状数组做法
题意:给你一个数组A,是否能组成给定的数组B合成规则:必须是大数合小数,大数和小数后,大数的值变成大数+小数合成时数字会自动向前补齐注意:合成的时候数字的位置会发生改变思路:1.先从左到右划分一遍数组A,如果不能整分,A数组肯定不能被合成B数组。划分后每个区间对应合成B数组中的一个值2.再暴搜每一个小区间,看能不能按规则合成出每个区间要合成的那个数。原创 2016-11-06 15:47:13 · 460 阅读 · 0 评论 -
poj 2299 Ultra-QuickSort 线段树求逆序数+离散化||归并排序求逆序数
题意:求数列逆序数思路:数据较大,但数据量较小,故先离散化,再做线段树单点更新。离散化同poj 2528点击打开链接。求逆序数同 poj 2352点击打开链接。代码:#include #include #include #include #include #include #define ls rt<<1,l,mid#define rs (rt<<1)+1,m原创 2016-10-25 12:15:45 · 380 阅读 · 0 评论 -
poj 2352 && hdu 1541 Stars 线段树
题意:按序在图上插入点,求每次插入点左下方有几个点,点的个数即为此点的等级。输出每个等级点的个数。思路:由于插入点的顺序是先下后上的故可以x轴为准,先查询点的左边有几个点,再插入点,不用考虑y轴。代码:#include #include #include #include using namespace std;#define ls rt<<1,l,mid#de原创 2016-10-25 12:04:25 · 337 阅读 · 0 评论 -
POJ 2823 Sliding Window 线段树
题意:给出一个长度为 N 的数组,从左至右求长度为 K 的区域中的最大值和最小值。思路:1.线段树维护一个最大值,一个最小值。从左至右循环更新树子叶节点。2.优先队列.代码:优先队列:点击打开链接线段树:#include #include #include using namespace std;#define ls rt<<1,l,mid#define原创 2016-10-25 11:55:22 · 282 阅读 · 0 评论 -
POJ 2528 Mayor's posters 线段树+离散化
题意:几张纸覆盖在一起,求能露出来的纸的个数。(区间覆盖问题)思路:区间最大值为1E8,开数组直接做MLE。注意到此题端点个数仅为20000个,故先离散,再线段树。代码:map离散 610ms#include #include #include #include #include using namespace std;#define ls rt<<1#d原创 2016-10-25 11:41:07 · 338 阅读 · 0 评论 -
NEFU 1215 统计序列和 (线段树模板题)
题意:中文思路:线段树模板题(update时可不用push_up)代码:#include #include #define ls l,mid,rt<<1#define rs mid+1,r,(rt<<1)|1#define mi (l+r)>>1using namespace std;const int MAXN=200005;long long ans,原创 2016-12-20 12:45:49 · 306 阅读 · 0 评论 -
HDU 1166 敌兵布阵
线段树搜索就行#include #include using namespace std;const int MAXN=5e5;typedef struct Node{ int left; int right; int mid(){ return (left+right)/2; } int val;}Node;Node tree[原创 2016-09-21 21:41:14 · 308 阅读 · 0 评论 -
POJ 3264 Balanced Lineup (线段树基础)
题意:给出一组数,快速查询某个区间中的最大值和最小值。计算最大最小值的差思路:线段树解决,时间为O(logn)#include #include #include #include #include using namespace std;const int MAXN=0x3f3f3f3f;const int NUMB=200000;typedef struct Node原创 2016-09-21 21:48:01 · 275 阅读 · 0 评论 -
HDU 2795 Billboard (线段树基础)
题意:有个公告板,大小为h*w,要贴n张公告,每个公告的长度是k,高度固定为1,公告放的要尽可能靠上并尽可能靠左,每给出一张公告,要求这个公告在满足要求的情况下放在了第几层。思路:按照线段树的做法的话,因为公告的高度固定为1,可以对公告板的高度进行切分,将其现在的宽度值存起来,然后每次遍历从左子树开始往下走,知道走到叶子节点满足要求即可。仿大神代码:(Length:680ytes)#i原创 2016-09-22 16:07:38 · 374 阅读 · 0 评论 -
HDU 1698 Just a Hook(线段树延迟更新)
题意:一段线段由n条小线段组成,每次操作把一个区间的小线段变成金银铜之一(金的价值为3,银为2,铜为1),最初可当做全为铜;最后求这条线段的总价值。思路:区间更新。区间更新思路: 更新时,把无代表性的父节点标记成0, 把要更新的父节点的旧状态甩给下一层, 然后再向下更新就行。#include #include #include using namespace std;原创 2016-09-27 12:48:13 · 261 阅读 · 0 评论 -
2018 牛客多校第二场 J farm
题意:翻译直接搬别人的了。给出一个n*m(n*m<=1e6)的农场,以及每个格子中植物的种类编号∈[1,n*m],接着给出T(T<=1e6)次施肥的信息,信息包括x1,y1,x2,y2,k(1<=x1<=x2<=n,1<=y1<=y2<=m,1<=k<=n*m)表示给在坐标(x1,y1)到坐标(x2,y2)的区间中全部植物...原创 2018-07-25 14:36:08 · 483 阅读 · 0 评论