线段树
文章平均质量分 79
Lazines_by
好吧,我要工作了
展开
-
线段树学习
线段树的根节点从1开始。它的左子树的编号是2 * n,右子树为2* n + 1;经典例题:hdu1166 敌兵布阵#includeusing namespace std;const int maxn = 50000 + 10;typedef long long ll;struct Tree{ int l; int r; ll sum;}tree[maxn * 4];原创 2017-03-17 18:42:17 · 202 阅读 · 0 评论 -
2018蓝桥杯模拟赛(一)--青出于蓝而胜于蓝(线段树)
题目链接:https://nanti.jisuanke.com/t/20690样例输入10 55 35 83 43 12 16 78 79 88 10样例输出0 0 2 0 4 0 1 2 0 0题意:给出一个根节点,然后判断每一个节点的孩子节点小于此节点的个数。思路:将树的前序遍历跑出来原创 2018-01-22 09:59:46 · 473 阅读 · 0 评论 -
codeforces 914D(线段树)
题意:1单点更新2查询[l,r]区间的值最多改变一个能不能使得区间的gcd等于给出的x,但是此改变不改变原来的值。思路:线段树维护gcd,很简单。查询的时候可以维护一个cnt的值,表示为当一个点的值不整除x的时候,对数进行改变的个数。当cnt>1的时候,直接结束函数。#includeusing namespace std;const int maxn = 5e5 +原创 2018-01-21 11:44:56 · 980 阅读 · 0 评论 -
hdu 4819(裸二维线段树)
树套树,这里查询方块的最大值+最小值/2,并在x,y处更新它#includeusing namespace std;typedef long long ll;typedef unsigned long long ull;#define clr(x,y) memset(x,y,sizeof x)#define INF 0x3f3f3f3fconst int maxn = 800原创 2017-10-16 21:59:11 · 382 阅读 · 0 评论 -
codeforces 242E(线段树)
题意:两个操作:1,查询区间和 2.对区间的所有的值进行异或x;思路:线段数维护一个区间的每一位的1的个数。#includeusing namespace std;#define clr(x,y) memset(x,y,sizeof x)typedef long long ll;const int maxn = 2e5 + 10;int a[maxn];int ad原创 2017-10-31 22:09:12 · 259 阅读 · 0 评论 -
hdu 1542(线段数+扫描线 求矩形并的面积)
题意:给出一系列的矩形,求出矩形的并的面积和。思路:将要求出来的总的面积以y轴为分界线,分成若干个部分,然后求出各个部分的面积。(以下转载自:http://m.blog.csdn.net/tomorrowtodie/article/details/52048323)此图用4条横线将整个图划分成了5个部分,显然此时再算面积就可以用各个颜色的部分求和。原创 2017-10-23 20:52:17 · 246 阅读 · 0 评论 -
hdu 5475(线段树(锻炼思维))
题意。初始X=1; 给n,mod ,表示n次操作操作1格式 : 1 b 表示用x乘上b操作2格式: 2 n 表示 当前x除掉第n次 "1操作” 的数每次操作输出一个答案,输出的答案是要对mod取模由于有除法所以我们不能每一步取模,因为对于每一个数对mod并不是都存在逆元一直在想什么办法能过。。。最后卡死了。。赛后才知道 直接就是一个长度为n的乘积线段树每个原创 2017-10-19 19:39:07 · 287 阅读 · 0 评论 -
hdu3966(数链剖分+线段树区间更新)
线段树区间更新得通过新映射的区间进行更新。PS:当初ad数组开小了,wa了好好几次,可惜#includeusing namespace std;typedef long long ll;typedef pair P;#define fi first#define se second#define INF 0x3f3f3f3f#define clr(x,y) m原创 2017-09-27 14:20:27 · 524 阅读 · 0 评论 -
poj查询区间第k大(划分树)
题意:查询某一个区间第K大的数是什么思路:线段树中保存的是一个对应区间的vector数组,每次合并区间的时候直接调用归并Merge函数。查询的话直接二分答案,判断是否有大于等于k个小于等于这个数的数。复杂度是m*log(n)^3PS :好像主席树屌一些,到时候再学学#include#include#include#include#includeusing na原创 2017-08-29 19:41:42 · 354 阅读 · 0 评论 -
hdu 2828
题意:给出一些人要插队的位置,然后要求输出最后的队列的排列情况。思路:最后的人的位置一定是固定的,所以倒序插入,插入之后这个位置就不参与计数了,所以问题变成,找到第 i 个空位,线段树记录该区间里有几个空位。#include#include#include#include#include#includeusing namespace std;const int max原创 2017-05-10 15:49:46 · 293 阅读 · 0 评论 -
hdu 2795
题意:给出一个广告板,然后要将n个广告贴在广告板上,然后要求每次贴广告的时候要越靠上越好,求每个广告贴的位置,找不到的话输出-1;思路:以高 为线段构造线段树,然后上面的值为区间的能放的最大值,每次查询的时候优先往左子树走; 当高很大的时候没有必要以高为线段进行构造线段树,直接以n来构造,因为最多有那么多的线段;#include#include#incl原创 2017-05-10 13:59:54 · 208 阅读 · 0 评论 -
线段树的区间更新
先介绍一下思想:转载自:http://blog.csdn.net/acceptedxukai/article/details/6933446感觉这个大佬说的思想很不错:给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c。需要用到线段树的,update:成段增减,query:区间求和介绍Lazy思想转载 2017-03-26 10:59:53 · 320 阅读 · 0 评论 -
hdu 6025
题意:在数列中删除一个数使得所有数的gcd最大;思路: 1.用一个前缀数组gd1[]记录前i个数的gcd,一个后缀数组gd2[]记录后i ~ n个数的gcd,当要删除第i个数的时候,数列的gcd为gcd(gd1[i - 1],gd2[i + 1]);为了使得能删除第一个数和最后一个数,增加了a[0] = a[n + 1] = 0;因为gcd(0,x) == x;2.当然也可以用线段原创 2017-05-09 13:06:15 · 303 阅读 · 0 评论 -
hdu 1698 简单区间更新
题意: 给出一个一个线段,然后这些的点原来是1,然后给出很多操作,使得某些区间的值变为1,2,或者3,然后查询最后的和;思路: 简单的区间更新,每个区间记录的是这个区间的点的类型是什么,或者是杂种类, 更新的时候,一定要找到这个区间进行更新,找的时候记得向下更新; 查询的话,因为这里是只查询所有数的和,所以在这写了两种,一个是只针对查所有数的情况,一个是任何一原创 2017-05-11 11:06:50 · 221 阅读 · 0 评论 -
code forces 383C(线段树)经典好题
题意: 两种操作,1.给出一个节点u,u的权值加上val,u的下一层孩子权值加上-val,下下层孩子加上val,一直2.查询节点u的权值思路:将树进行离散化,跑个dfs,然后节点和它的孩子节点都在一个连续的区间内。 更新的时候,因为对于每一层的更新情况不一样,主要是层数奇偶性不同的更新情况不一样,我们可以建立两棵线段树,一个记录的是奇数层的节点的情况,一个是偶。当为奇数线原创 2018-01-23 15:12:47 · 381 阅读 · 1 评论