数据结构:线段树
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
UESTC 1073 秋实大哥与线段树 线段树&&改值与区间和 or 树状数组
“学习本无底,前进莫徬徨。” 秋实大哥对一旁玩手机的学弟说道。 秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构。 为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作。 秋实大哥的题目要求你维护一个序列,支持两种操作:一种是修改某一个元素的值;一种是询问一段区间的和。 Input 第一行包含一个整数nn,表示序列的长度。 接下来一行包含nn个整数aiai,表示序列初始的元素。 接下来一行包含一个整数mm,表示操作数。 接下来mm行,每行是以下两种操作之一: 1 x v : 表原创 2016-03-10 23:11:54 · 1945 阅读 · 1 评论 -
HDU - 6203 ping ping ping LCA倍增算法+dfs序+线段树
题意:给出一颗以0为根有n+1个节点的树,给出p个条件,每个条件表示u,v之间有一个坏的节点,根据这p个条件求出树上至少有多少坏点。 LCA+dfs序+线段树 先跑出dfs序,并对LCA进行预处理。 然后把每组条件按照u,v的LCA为第一优先级丢到优先队列里, 且对于dfs序有个性质,如果P是U的祖先,则 p1[P] <= p1[U] <= p2[U] <= p2[P], 故每次对于每个LCA(u,v),u,v : 先判断 u,v是否存在被标记的祖先,如果都没有说明需要新标记一个点为坏点,即把LCA(u,v原创 2017-10-16 15:37:44 · 864 阅读 · 0 评论 -
Codeforces 620E New Year Tree dfs序+线段树+状态压缩
题意:给定一棵树,每个节点都有颜色,然后询问子树上有多少种不同的颜色。 dfs序+线段树+状态压缩 由于只有60种颜色(2^60 < 2^63),所以可以直接用二进制压位。 即sum[Ind]维护的是该区间的一个状态,从右向左第i位表示第i种颜色在该区间是否出现。 然后用上线段树区间修改+区间查询即可。 时间复杂度 O(nlogn) 空间复杂度 O(4*n)原创 2017-10-13 18:22:55 · 862 阅读 · 0 评论 -
UESTC 1600 艾尔大停电 线段树+扫描线、矩形面积并、浮点数的离散化
题意:在一个二维平面上给出n个矩形,求这些矩形的总覆盖面积。 线段树+扫描线、矩形面积并、浮点数的离散化 线段树+扫描线的经典例题,这里就不重复描述了。 请注意浮点数的离散化,用unique会有一定的误差,所以建议用最朴素的方法进行离散化。 线段树每个节点维护的是一个区间[x, x+1]而不是一个区间端点。 复杂度 O(nlogn)原创 2017-05-16 19:42:27 · 2042 阅读 · 0 评论 -
UESTC 1581 Rikka的烦恼 分块、线段树
题意:给出一个序列,询问某一段下标是等差数列的子序列的最大值。每次询问给出首项和公差。 每次单点修改。 分块、线段树 由于 7e4*7e4 == 4.9e9,所以如果除以10的话,4.9e8,大致可以满足1ms == 1e9次运算, 所以设定一个阈值,公比大于k的时候,直接算出最大值, 公比小于k的时候用O(k^2)棵线段树维护,tree[i-1][j]表示以i为公比j为首项的线段树。 所以先预处理出线段树, 然后每次询问根据k的不同,分别直接处理或者用线段树维护。 复杂度 O(n^2/k)原创 2017-05-16 18:59:31 · 865 阅读 · 0 评论 -
UESTC 1598 加帕里公园的friends 线段树区间合并
题意:单点更新,区间查询最大子区间和。 线段树区间合并 每个节点维护四元组 int sum[4*MAXN], suml[4*MAXN], sumr[4*MAXN], ans[4*MAXN]; sum[Ind]表示该区间的和,suml[Ind]描述该区间从左端点开始的最大连续和, sumr[Ind]表示从该区间右端点结束的最大连续和,ans[Ind]表示该区间的最大子区间和。 每次pushup的时候,刷新这四元组, ans[Ind] = max(max(ans[Ind<<1], ans[Ind<<1|1]),原创 2017-05-16 18:50:53 · 897 阅读 · 0 评论 -
UESTC 1592 An easy problem B 线段树区间合并
题意:区间更新把该区间内所有的数异或1,区间查询该区间内最长连续1的长度。 线段树区间合并 每个节点维护十元组 int summid[4*MAXN][2], suml[4*MAXN][2], sumr[4*MAXN][2], ans[4*MAXN][2], lazy[4*MAXN], rev[4*MAXN]; summid[Ind][k]表示该区间的中间的最长连续k(0|1)的长度, suml[Ind][k]描述该区间从左端点开始的最长连续k(0|1)的长度, sumr[Ind][k]表示从该区间右端点结束原创 2017-05-16 18:06:18 · 848 阅读 · 0 评论 -
UESTC 1597 An easy problem C 线段树+延迟操作+一次函数
题意:N个数排成一列,有三种操作。1.给一段区间内的每个数乘上一个非负整数。 2.给一段区间内的每个数加上一个非负整数.3.询问一段区间的和模上P的值。 线段树+延迟操作+一次函数 用2个lazy数组,分别为lazya[i], lazyb[i], 表示 lazya[i] * x + lazyb[i], 即用一个一次函数,或者说一次系数和常数项 来表示每个节点lazy数组的情况。 每次pushdown的时候,如果lazya或者lazyb有至少其中一个值需要向下传递, 则都一起操作。 先把 lazya的值传递给原创 2017-05-16 18:11:23 · 943 阅读 · 2 评论 -
Gym - 101102C C. Bored Judge 线段树+贪心+反向推
题意:给出一系列分数变化情况,x p 表示队伍x获得了p分,求出最终winner在ans事件之后就一直是第一名,求出ans,(如果winner一直是winner,则ans = 1)。 线段树+贪心+反向推 先计算出每个队伍最终的分数,求出winner的最终分数和队伍编号, 然后把每个队伍的分数输入到线段树,用线段数来维护1~n的最大值,存储在team[1]里, 然后反向的遍历事件, Modify(ord[i], -p[i]);如果if(team[1] == maxi){ans = i - 1;}一旦不满足就原创 2017-01-14 21:28:21 · 1107 阅读 · 0 评论 -
Codeforces Round #381 (Div. 2) D. Alyona and a tree dfs+二分+线段树延迟操作、树形化线性
题意:一颗树,以有向图的方式读入,每个节点都有一个权值,每条边也有一条权值,当u在v的子树中,且u到v的边权和 <= u的点权时称v可以控制u。求出每个点可以控制 的结点的个数。 dfs+二分+线段树延迟操作、树形化线性 线段树延迟操作区间修改单点查询 O(nlogn) 前缀和sum[ptr]维护的是u到根的路径上的边权和 O(n) 用 树形转化为线性的思想 做,dfs到u的子节点v时,用二分的方法找到最靠近根的节点lr, 然后用把[lr, ptr-1]加1。 当当前结点u,开始回溯的时候,此时单点查询,线原创 2016-11-27 17:26:36 · 831 阅读 · 0 评论 -
2016 UESTC Training for Data Structures B - 卿学姐与基本法 自己构建了一个和堆有点像的数据结构
对很多个区间进行处理, 这里建一个结构体放存放区间,然后把区间放到vector里,根据左边界排序, 然后逐次进行处理使所以区间变成不相交的区间 一直维护这样的区间 至于说像堆, 是因为: 这个也是延迟操作,在查询单时候才进行维护的 维护时,删除vector的那些元素时令那个元素的 了left 成员为INF,然后sort再pop_back() 查询的时候就vector中的元素一个个查询过去了☺原创 2016-05-01 00:01:37 · 1540 阅读 · 0 评论 -
2016 UESTC Training for Data Structures A - 卿学姐与公主 线段树
裸的的线段树,主要是Top[]数组开的足够大,且不太大 2^(n-1) = k; ==> k = logn + 1 用等比数列求和公式sum = 2*n - 1 但一般开成4*maxn就可以了,如果要卡一卡内存,可以试试2.5*maxn , 2.6*maxn , 3*maxn etc.原创 2016-05-01 00:01:20 · 1146 阅读 · 0 评论 -
2016 UESTC Training for Data Structures Q - 昊昊爱运动 II 线段树+延迟操作+bitset
每次把一个区间变为一个定值 线段树+延迟操作+bitset 延迟操作,在查询或者改造的时候再向下传并标记好 先用memset全部标记为false表示值没有传下去; 在建树的时候就要一次把标记改为true了 然后改造的时候重新标记为false, 向下传的时候把false改为true,然后false也传下去; 返回的时候维护 另外每个节点用bitset维护, push_up的时候 Top[Ind]=Top[Ind<<1] | Top[(Ind<<1)+1]; //这样自然就把原来的Top[Ind]去掉原创 2016-05-01 00:04:22 · 1697 阅读 · 0 评论 -
Codecraft-18 and Codeforces Round #458 (combined) D. Bash and a Tough Math Puzzle 线段树+二分+卡时间+优化
题意:给出一个长度为n的序列,q个操作,每次询问区间[a,b]内最多改一个数,能不能变成gcd(a~b)== x;或者把第i个数改成y。 线段树单点修改区间查询+二分+卡时间+优化 用线段树单点修改区间查询来维护一段区间的gcd, 然后对于修改操作可以直接修改, 而对于询问操作则要二分出一个最大的区间[a,mid]满足gcd(gcd(a~mid),x) == x, 此时如果mid == b 或者 mid == b-1或者 gcd(gcd(mid+2~b),x) == x 则 Yes,否则No。 当mid不存原创 2018-02-01 12:57:12 · 519 阅读 · 0 评论