线段树
nbl97
这个作者很懒,什么都没留下…
展开
-
hdu5828 Rikka with Sequence (线段树:区间开根+区间求和+区间加减)
题意:对一个n元素序列进行三种操作:1 l r x : 对a[l,r]之间所有元素都加上x2 l r: 对a[l,r]之间所有元素开根号3 l r: 输出a[l,r]之间的元素和(1<=n,m<=1e5 , 1<=A[i],x<=1e5)分析:这道题难点就在“区间开根”这一操作。因为如果像正常的区间更新一样,用懒惰标记,我们会发现无法快速更新区间信息,也就是说无法快速得到它询问的区间和。所以原创 2017-08-04 11:33:32 · 618 阅读 · 0 评论 -
2017acm香港区域赛 Black and White
题目:有一个初始颜色全为白色的n*n的棋盘,每次选一个长方形区域反转颜色,问最后会有几个黑色格子。n,k&lt;=10000分析:和扫描线求面积并一样。记录每条横边,向x轴投影。只不过不区分上边和下边。按高度排序后,对于每条边,向x轴投影,将投影的区间进行一次 xor 1 的操作。所以线段树维护区间异或操作,然后每次询问区间和。代码:#include&lt;bits/stdc++.h&g...原创 2018-11-05 21:56:56 · 346 阅读 · 0 评论 -
hdu1828 Picture (线段树+扫描线)
题目:给n个矩形求周长并。分析:唯一需要注意的地方就是,对线段排序的时候不能单纯只考虑高度,还要考虑是上边还是下边。如果有一个上边和一个下边高度一样,那么应该让上边在前下边在后。代码:#include <bits/stdc++.h>using namespace std;#define ms(a,b) memset(a,b,sizeof(a))#define lson ...原创 2018-11-05 11:33:01 · 148 阅读 · 0 评论 -
hdu1542 Atlantis (线段树+扫描线)
题目:给n个矩形,求矩形的面积并。n <= 100分析:扫描线求面积并模板题。需要注意的是,线段树记录的不是点,而是边。数轴上若有 1-n 共 n 个点,则会切出 n - 1 条不能再切分的小线段,将这些线段从左至右依次标号为 1 - (n-1)。线段树的每个叶子节点就表示一条小线段。线段树避免同一段重复加的方法是:对于某一段,如果tag[rt] > 0,则不通过子树来更新值...原创 2018-11-05 00:31:30 · 121 阅读 · 0 评论 -
hdu5692 Snacks (dfs序+线段树)
题意:百度科技园内有n个零食机,零食机之间通过n−1条路相互连通。每个零食机都有一个值v,表示为小度熊提供零食的价值。由于零食被频繁的消耗和补充,零食机的价值v会时常发生变化。小度熊只能从编号为0的零食机出发,并且每个零食机至多经过一次。另外,小度熊会对某个零食机的零食有所偏爱,要求路线上必须有那个零食机。为小度熊规划一个路线,使得路线上的价值总和最大。 输入数据第一行是一个整数T(...原创 2018-09-15 21:05:12 · 229 阅读 · 0 评论 -
hdu6477 YJJ's Salesman (线段树+dp)
题目:一个人从(0,0)走到(10^9,10^9),每次只能往右、上、右上走一个单位。 在地图上,有n个村庄,每个村庄有一个收获值,只有当从左下方走到某个点的时候,这个点的收获值才能被获取。给出n个村庄的坐标和每个村庄的收获值,问最大的收获值和是多少。 (1≤N≤105)分析:用线段树根据y轴维护收获值和。 对y离散化,然后对所有村庄按照x从小到大,y从大到小的顺序排序。对于第i...原创 2018-08-26 00:48:08 · 428 阅读 · 0 评论 -
hdu1087 Super Jumping! Jumping! Jumping!(线段树+DP)
题目:求一个数列的最长上升子序列和。(1≤n≤105,ai是32位整数)(1≤n≤105,ai是32位整数)(1 \leq n \leq 10^5, a_i是32位整数)分析:其实这个题的数据没有那么大,n^2的算法也可以过,在此提供一种O(nlogn)的做法。转移方程是dp[i] = max(dp[j]) + a[i], (1<= j < i, a[j] < ...原创 2018-08-26 00:23:28 · 150 阅读 · 0 评论 -
计蒜客2018蓝桥A组模拟赛(一)青出于蓝胜于蓝(dfs序+线段树)
题目:武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,… 武功最低的人排名第 n。现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师父,每个人可能有多个徒弟。我们知道,武当派人才辈出,连祖师爷的武功都只能排行到 p。也就是说徒弟的武功是可能超过师父的,所谓的青出于蓝胜于蓝。请你帮忙计算每个人的所有子弟(包括徒弟的徒弟,徒弟的徒弟的徒原创 2018-04-16 22:58:38 · 319 阅读 · 0 评论 -
hdu3333 Turing Tree(离线处理+线段树)
题目:给一个序列a,询问一个区间[l,r],输出区间内不同数字的和。 (1 ≤ N ≤ 30000,1 ≤ Q ≤ 100000)分析:这种题看出来是线段树做,但是线段树不能只加一个区间里不同的数字。从线段树入手是不可能了,所以想办法怎么能让一个区间内相同的数字只被计算一次。既然树不可更改,说明求和的时候相同的数只有一个在树里,想办法实现这个就可以了。核心就是从小区间往大区间一点一点扩展,这棵树肯原创 2017-10-14 03:27:32 · 330 阅读 · 0 评论 -
hdu5877 Weak Pair(离散化+线段树+dfs)
题目:一棵有n个节点的树,每个点有一个权值。给出k,要求找出树上有多少个数对 (u,v) 满足如下条件:u是v的祖先。(u,v不同)au∗av≤ka_u*a_v\leq k 分析:利用dfs的过程,在dfs遍历一棵树的时候,若此时在v点,那么可以保证的是v点所有的祖先都已经被遍历了。所以,我们可以把v之前的点加入线段树,到v的时候直接查询出在祖先中有多少个≤av\leq a_v。但是,有一些点原创 2017-10-06 02:33:47 · 229 阅读 · 0 评论 -
hdu6070 Dirt Ratio (线段树:二分+多次建树+构造难想)
题目:给一个 n 个数的序列,选出一段区间,使得这段区间数字种数数字个数\frac{数字种数}{数字个数}的值最小,输出这个最小值。误差不要超过1e-4,1 <= n <= 60000,1 <= ai <= n分析:这道题看到之后应该能想出来是二分,这种题通常都需要二分。但是没有想出二分完怎么判断是否可行。判断也就是判断是否有一个区间满足size(l,r)r−l+1≤mid\frac{size(l,原创 2017-08-12 22:38:36 · 248 阅读 · 0 评论 -
hdu5306 Gorgeous Sequence(线段树:复杂区间更新)
题目:三种操作0 l r t: 使这个区间的每个值变成min(t,a[i])。 1 l r: 输出区间最大值 2 l r: 输出区间和(1 <= n,m <= 1e6, 0 <= ai,t <= 2^31)分析:1和2操作很简单,0操作很难,一个一个改时间肯定不允许,但是又没什么办法可以直接全改掉。结合题目问的是区间最大值和区间和,那么就思考操作 0 会对区间最大值和区间和有什么影响,于是原创 2017-08-05 01:44:42 · 1536 阅读 · 1 评论 -
codeforces 438D The Child and Sequence(线段树:单点更新+区间取模+区间和)
题意: 一个n个数的序列。对它进行 3 种操作。 1 l r:输入a[l,r]的和 2 l r x:令[l,r]所有数对x取模 3 k x:令a[k] = x 每到操作1时输出和。 (1 ≤ n, m ≤ 1e5). (1 ≤ a[i] ≤ 1e9)原创 2017-08-03 21:22:08 · 743 阅读 · 0 评论 -
2018-2019 ICPC, NEERC, CodeForces 1070C Cloud Computing(权值线段树)
题目:有n天,每天需要k个cpu。现在有m个供应商,第i个供应商可在[li,ri]天之间,每天提供ci个cpu,每个cpu价格为pi。如果某一天的cpu无论如何也凑不够,那就把仅有的全用上。问n天的最小花费。分析:最开始的想法是,把供应商按价格排序,然后依次取供应商去提供一个时间段的cpu。在线段树上想办法把这个时间段做一个区间减法。但发现其实在线段树上很难操作,很难知道供应商提供的区间哪...原创 2018-11-14 22:03:17 · 268 阅读 · 0 评论