
线段树
Mr.Gzj
这个作者很懒,什么都没留下…
展开
-
P2824 [HEOI2016/TJOI2016]排序(线段树+二分)
题意: 给出一个1到n的排列,现在对这个排列序列进行m次局部排序,排序分为两种: 0 l r表示将区间[l,r]的数字升序排序 1 l r表示将区间[l,r]的数字降序排序 注意,这里是对下标在区间 [l,r]内的数排序。 最后询问第q位置上的数字。 思路: 有两种方法,一种在线一种离线。 离线的方法主要是考虑到只有一个询问,就是询问q位置的数字,我们可以...原创 2019-11-11 22:12:18 · 333 阅读 · 0 评论 -
cf558E. A Simple Task(权值线段树+计数排序)
传送门 题意: 给定一个长度不超过10^5的字符串(小写英文字母),和不超过50000个操作。每个操作 L R K 表示给区间[L,R]的字符串排序,K=1为升序,K=0为降序。最后输出最终的字符串。 思路: 注意到只有26个字母,而且长度不超过1e5,所以可以来一个计数排序,建立26个线段树,每个字母用一个线段树维护。 有一个坑点就是区间赋0的时候,主要lzay标记不用时应置为-1,不能是0,这...原创 2019-11-08 19:42:04 · 299 阅读 · 0 评论 -
hdu 6315 Naive Operations(线段树区间整除区间)
题意: 给出一个长度为nnn初值为0的a数组,以及长度为nnn的bbb数组,b数组是开始给出的固定的。 接下来qqq次操作,add(l,r)add(l,r)add(l,r) 使得数组a区间[l,r][l,r][l,r]所有元素+1,或者查询∑i=lra[i]b[i]\sum^{r}_{i=l}{\frac{a[i]}{b[i]}}∑i=lrb[i]a[i] 思路: 区间操作一般就用线段树来维护...原创 2019-11-08 00:25:32 · 363 阅读 · 0 评论 -
HDU1540Tunnel Warfare(线段树维护连续区间)
题意:一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点。 思路:线段树维护连续区间,定义结构体来表示线段树节点,t[i].l,t[i].r表示这个节点所包含的区间从最左边起的最大连续区间,和从最右边起的最大连续区间。 查询的时候我们考虑对于需要查询的点,往左右两个区间转移,如果在左子树且在右区间范围,那么结果就是左子树的右区间长度+右子树...原创 2019-11-08 00:03:54 · 302 阅读 · 0 评论 -
K. Addition Robot(矩阵乘法+线段树)
链接 题意:给出一个长为n,只含有AB字符的字符串,有q次操作,第一种是[L,R]内的字符A变成B,B变成A,第二种是询问L,R,A,B 按这种方式求和:。 思路: 建立线段树,每个节点都是一个矩阵,然后区间修改,区间求和即可。 #include<bits/stdc++.h> #define ll long long using namespace std; const i...原创 2019-10-28 17:43:35 · 555 阅读 · 0 评论 -
D2. Too Many Segments(线段树)
题意:给出n个线段,要求同一个点不能有超过k条线段覆盖。求最少要删多少条线段。 思路:要求最少删除多少线段,只要尽量多的线段重叠就好了,所以可以对区间进行先按右端点从小到大, 若右相等则按左从小到大这样排序。然后依次插入这些区间, 若一个区间满足这个区间内的点的最大被覆盖次数还不足 k, 那么就将这个区间覆盖下去, 否则加上这条边的话,就会产生坏点,这条边同时也是产生坏点的最长的边,所以这个区间...原创 2019-10-23 17:43:56 · 406 阅读 · 0 评论 -
牛客练习赛53E 老瞎眼 pk 小鲜肉(线段树)
题意: 老瞎眼有一个长度为 n 的数组 a,为了为难小鲜肉,他准备了 Q 次询问,每次给出 一个区间[L,R],他让小鲜肉寻 找一对 l,r 使L<=l<=r<=R 且 a[l]a[l+1]a[l+2]…^a[r]=0,老瞎眼只让他回答r-l+1 最小是多少,若没有符合条件的 l,r 输出”-1”。 思路: 预处理出对于每个位置i找到左边离i最近的位置j使得a[j]^ a[j+1...原创 2019-10-12 23:58:07 · 192 阅读 · 0 评论 -
2019牛客暑期多校训练营(第四场) C - sequence(单调栈+线段树)
题意: 给出两个数组a,ba,ba,b,区间[L,R][L,R][L,R]的值为min(a[L,R])∗sum(B[L,R])min(a_{[L,R]})*sum(B_{[L,R]})min(a[L,R])∗sum(B[L,R]),求区间[1,n][1,n][1,n]的最大值。 思路: 用单调栈求aaa里每个数以它为最小值的区间,枚举这些区间,用线段树维护bbb数组的前缀和,若a[i]&...原创 2019-07-28 21:47:50 · 226 阅读 · 0 评论 -
【2019 HDU多校集训第九场】 Rikka with Cake 线段树
题意: 给出一个左下角为(0,0)(0,0)(0,0),右上角为(n,m)(n,m)(n,m)的矩形,然后给你kkk条射线,每条射线的起点及方向(上下左右)都已知,射线的起点都位于矩形内,不包括矩形边界,且每条射线间不会有重叠,求矩形被分割成多少块。 思路: 用线段树解,题中说是射线,所以我们可以对y轴离散化,对x轴排序后用线段树维护y轴坐标,遇到向上或向下的射线,则在线段树区间上加一,当遇见向左...原创 2019-08-20 13:57:05 · 310 阅读 · 0 评论 -
hdu6703array(权值线段树)
题意:t 组样例,每组给出 n,m(n<100000), n个数 从1到n顺序不定,m次询问。 格式为 (1,t1)或(2,t2,t3) 1 操作 t1 = t1^lastans.把 a[t1] 的值 加10000000, 2 操作 t2^=lastans, t3^=lastans,问 1到 t2 区间没有出现过且不小于 t3 的最小数是多少。 思路:数组中的值唯一,且在1到...原创 2019-08-24 22:04:55 · 275 阅读 · 0 评论 -
P5490 【模板】扫描线
题目描述 求n个矩形的面积并。 #include <bits/stdc++.h> #define ll long long #define INF 0x3f3f3f3f using namespace std; const int N = 1e5 + 10; int n, v[N << 1]; struct node { int x, s, xi, f; ...原创 2019-08-21 00:19:24 · 211 阅读 · 0 评论 -
hdu6638Snowy Smile(线段树求区间最大子段和)
题意: 给出平面上n个点(xi,yi)(x_i,y_i)(xi,yi),每个点都有一个权值wi(−109<xi,yi,wi<109)w_i(-10^9<x_i,y_i,w_i<10^9)wi(−109<xi,yi,wi<109),选取一个边与坐标轴平行的矩形,使这个矩形内的点的权值之和最大,问这个最大权值和是多少。 思...原创 2019-08-25 20:57:33 · 370 阅读 · 0 评论 -
(模板)线段树求区间最大子段和 SP1043 GSS1 - Can you answer these queries I
题意:给出一个区间,m次询问,每次询问区间最大子段和。 #include<bits/stdc++.h> #define ll long long using namespace std; const int N = 5e4 + 10; int n, M, w, l, r; struct node { int sum;//[l,r]区间之和 int msum;//[l,r...原创 2019-08-25 21:31:21 · 181 阅读 · 0 评论 -
The Preliminary Contest for ICPC Asia Xuzhou 2019 I. query (线段树+二维偏序)
题意: 给你一组nnn个数字,这些数字是1 n1~n1 n的一个排列。现在有很多个询问,询问给定一个区间,问区间内有多少个整除对。 思路: 设sum[i]sum[i]sum[i]为从1到i的所有整除对数量。对于区间[l,r][l,r][l,r],我们知道,区间[l,r][l,r][l,r]的整除对数量是sum[r]−sum[l−1]sum[r]-sum[l-1]sum[r]−s...原创 2019-09-09 16:35:44 · 184 阅读 · 0 评论 -
2019HDU多校训练第二场 Longest Subarray(线段树)
题意:给你一个串,问满足以下条件的子串中最长的是多长:对于每个数字,要么在这个子串没出现过,要么出现次数超过k次。 思路:我们考虑枚举右端点,对于当前右端点,我们单独考虑每一种数的合法区间。假设当前枚举的右端点是i,考虑的数字是c,在右端点左边离i最近的数字c的位置是p1,离i第k远的数字c的位置是p2, 容易发现,数字c的合法区间为[1, p2]和[p1 + 1, i],对应的情况是选择这个数...原创 2019-07-26 23:25:21 · 166 阅读 · 0 评论 -
2019HDU多校 6609 Find the answer(权值线段树)
题意:给出一组数,对于每个数a[i]a[i]a[i]求出iii最少删除多少个数使得他的前缀和小于mmm。 思路:用权值线段树维护数的个数以及以iii为右端点的前缀和,查询就是查最多可以取多少数使前缀和小于mmm。 #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 2e5 + ...原创 2019-07-30 20:50:22 · 180 阅读 · 0 评论 -
HDU1166 敌兵布阵
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。 ...原创 2018-12-26 21:32:56 · 241 阅读 · 0 评论 -
P2184 贪婪大陆
题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾。现在,小FF的后方是一望无际的大海, 前方是变异了的超级蚂蚁。 小FF还有大好前程,他可不想命丧于此, 于是他派遣手下最后一批改造SCV布置地雷以阻挡蚂蚁们的进攻。 题目描述 小FF最后一道防线是一条长度为N的战壕, 小FF拥有无数多种地雷,而SCV每次可以在...原创 2018-12-30 11:52:22 · 305 阅读 · 0 评论 -
poj2528Mayor's posters(线段树+离散化)
这道题写哭了快,为什么要放在线段树简单题里,我觉得一点也不简单啊,起码让我做个求逆序对的线段树再来这个 啊,一上来就这道题,给我做懵逼了,别人的题解也看不懂,上午做了道求逆序对的终于感觉开了窍。 思路:离散化应该不用我说了,不会的看这一篇(虽然我还是因为离散化写错莫名re),然后就是区间覆盖值,单点取值,常规操作了。 #include<bits/stdc++.h> #define...原创 2019-03-19 16:11:14 · 159 阅读 · 0 评论 -
ZOJ1610 Count the Colors
思路:区间更新,另外千万不能拿n建树,不然就会segmentation fault,必须拿8000建树,也就是树是固定的 #include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define ll long long #define ld long double #defi...原创 2019-03-19 20:55:56 · 250 阅读 · 0 评论 -
线段树详解 (原理,实现与应用)
https://blog.youkuaiyun.com/zearot/article/details/48299459# 线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点。 线段树的用处...转载 2019-03-17 17:14:48 · 256 阅读 · 0 评论 -
hdu1754I Hate It
线段树求区间最值。 pushup操作时就赋予最大值。 查询操作就好搞了。另外,用cin会wa #include <bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define ll long long #define ld long double #define mem(ar,n...原创 2019-03-17 17:24:12 · 136 阅读 · 0 评论 -
poj3468A Simple Problem with Integers(区间更新查询模板)
#include <bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define ll long long #define ld long double #define mem(ar,num) memset(ar,num,sizeof(ar)) #define me(ar) memse...原创 2019-03-17 17:56:57 · 181 阅读 · 0 评论 -
hdu1698Just a Hook
要求线段树区间修改,那就修改一下懒标记和赋值。 #include <bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define ll long long #define ld long double #define mem(ar,num) memset(ar,num,sizeof(...原创 2019-03-17 19:47:02 · 192 阅读 · 0 评论 -
hdu1556Color the ball(线段树)
本来感觉自己不会,然后看了一个特别骚的做法 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #define fi first #define se second #define INF 0x3f3f3f3...原创 2019-03-18 18:41:40 · 138 阅读 · 0 评论 -
P1908 逆序对(线段树+离散化)(应该也算是权值线段树了吧)
思路:讲数组arr离散化后再加入线段树tree中,tree[arr[i]]++;意思是数组在线段树中的位置加一,然后统计arr[i]+1到n的和,就是到目前i的逆序对数目。 #include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define ll long long #d...原创 2019-03-19 09:28:14 · 311 阅读 · 0 评论 -
HDU4027 Can you answer these queries?
思路:这道题很坑。 区间开根号加区间求和,开根号,该怎么开,每个点开肯定超时,然后自己拿计算机算了算,long long之内的数据大概开7次根号就成为1了,那先一个一个开根号,然后再剪枝,和等于区间个数时直接return,这样10w个数据开70w次根号,,我运行了一下,只需要3ms就算出来了,所以肯定不会超时。 不过这道题很坑,它输入的l可能会比r大,另外卡cin,cin会tle,取消同步就6...原创 2019-03-28 15:32:05 · 186 阅读 · 0 评论 -
hdu1542Atlantis (线段树+扫描线+离散化)
模板题。。 #include<bits/stdc++.h> #define ll long long #define y1 yeee using namespace std; const int N = 8e2; int n, add[N], m; double tree[N], x1, x2, y1, y2, x[N]; //以横坐标作为线段(区间),对横坐标线段进行扫描 //扫...原创 2019-04-14 11:36:24 · 257 阅读 · 0 评论 -
P1712 [NOI2016]区间(线段树+离散化)
题意:给出n个区间,让你选出m个区间,使这些区间共同包含至少一个位置,一个区间的花费就是右端点减去左端点,,让你求复合题意的最小花费是多少。 思路:花费就是区间的长度,求总长度最小,先按长度排序,然后用一个线段树维护区间长度,使线段树里的区间数为m,若有线段覆盖,则加一,若该线段被抛弃,则减一,用尺取法选一遍就好了。统计最大的值若为m的话则这m个区间共同包含一个位置,最大值就是直接看tree[1...原创 2019-07-21 16:19:50 · 230 阅读 · 0 评论 -
P3372 【模板】线段树 1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将...原创 2018-12-29 16:36:50 · 222 阅读 · 0 评论