线段树
文章平均质量分 50
keyboarder_zsq
你所认为的极限,其实是别人的起点。
展开
-
POJ3468【线段树lazy操作】
上午理论AC,打到现在快吐了。。。 一个那么**Lazy操作打成这样,query操作和update操作都有问题,妈蛋,发现是mid<=s+1…真是蠢到家,明明是mid+1<=s卧槽连左和右都分不清。。。 什么是lazy? lazy做法: 查询一个区间,如果这个节点的区间正好是满足,那么直接返回,眼睛都不眨一下,如果不是,就要让根的标志和他的子节点搞一搞,然后继续分下去,判断与mid的关系,因原创 2016-08-03 23:19:18 · 776 阅读 · 0 评论 -
lightoj 1089 【离散化+线段树】
题意:给你n个区间,然后给你m个i点问你这个点在几个所给定的区间里;思路:离散化+区间覆盖#include using namespace std;typedef long long LL;const int N=5e4+10;struct SegT{ int left,right; int val; int flag;};SegT q[N*1原创 2016-11-19 11:00:39 · 427 阅读 · 0 评论 -
Lightoj 1082【RMQ】
这里很low地写了个线段树。。。#include using namespace std;typedef long long LL;const int N=1e5+10;struct SegT{ int left; int right; int w;};SegT q[N*4];void Build(int num,int L,int R){ q原创 2016-11-21 19:05:00 · 445 阅读 · 0 评论 -
Lightoj1081【500棵线段树维护】
#include using namespace std;typedef long long LL;const int N=5e2+10;const int INF=0x3f3f3f3f;struct SegT{ int left; int right; int w;};SegT q[N][N*4];int dp[N];int a[N][N];v原创 2016-11-21 21:04:34 · 375 阅读 · 0 评论 -
Lightoj1080 【线段树】
题意:给你一个0/1的数组,然后给你n段区间,说这个区间里要反转一次,然后给你Q个询问,问你这个位置是什么;思路:我们线段树维护一下就好了额;其实反转的话,还是算次数是不是,奇偶嘛;#include using namespace std;typedef long long LL;const int N=1e5+10;struct SegT{ int sum;原创 2016-11-23 01:58:38 · 378 阅读 · 0 评论 -
POJ3264 【RMQ基础题—ST-线段树】
ST算法Code://#include#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int N=5e4+10;int n,q;int a[N];int f1[N][30];int f2[N][30];void ST()原创 2017-01-23 20:19:08 · 362 阅读 · 0 评论 -
HDU5997 【线段树】
good game.原创 2016-12-18 00:10:21 · 657 阅读 · 0 评论 -
BZOJ 3211【线段树】
题意:n个数,m个操作。1,L,R 询问[L , R] 的总和。2,L,R 将区间所有数都开根号。思路:区间和简单。主要就是一个 区间所有元素相同的标记Same ,但是这样是不是要求太高?sqrt 好像就算是1e9,也down的非常快到1了,且这里还没有区间加。so,只要考虑标记区间是否都是1/0就足够了。水题。#includeusing namesp原创 2017-03-28 22:35:45 · 354 阅读 · 0 评论 -
BZOJ 1012【线段树】
题意:Q L 询问数列最后 L 个数中最大的数。A n 将 n + t ( t_init = 0 ), 然后插到最后去。思路:感觉动态地插入,很有问题。数组地长度会时常变化,但是可以先预处理就是有2e5个结点(最多)。然后就是插咯?它保证query 的时候 L 水题。#includeusing namespace std;typedef long long原创 2017-03-29 18:49:39 · 413 阅读 · 0 评论 -
BZOJ 1858【线段树】
题意: 0 a b 把 [a, b] 区间内的所有数全变成0 1 a b 把 [a, b] 区间内的所有数全变成1 2 a b 把 [a,b] 区间内的所有数全部取反 3 a b 询问 [a, b] 区间内总共有多少个1 4 a b 询问 [a, b] 区间内最多有多少个连续的1 思路:首先 线段树 可以搞个标记 flag 是否都是 1(flag=1)/0(flag=-原创 2017-03-29 21:32:13 · 422 阅读 · 0 评论 -
HUST1349 Signal Beacon【单调栈+线段树DP】
题意:有 nn 座山,每座山有一个高度 HiHi,在每座山上安放一个信号塔需要花费CiCi,每座山上的信号塔的信号能传到向左/右离这座塔最近的比他高的山。思路先预处理对每座山的信号塔向左和向右最远的位置[Left,Right][Left,Right],这里利用单调栈就可以了。 将每个区间按照左端点从小到大排序,左端点相等的话,按照右端点从小到大排序。 dp[i]dp[i] 代表从位置 11 到位原创 2017-05-01 19:18:46 · 555 阅读 · 0 评论 -
51nod1287【线段树+折半搜索】
思路:其实就是每次折半找一下对吧,但是要维护出一个区间最(大)值,所以套一个线段树就可以轻松解决了。#includeusing namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const int N=5e4+10;struct asd{ int Left,Right; int val;原创 2017-04-26 23:07:13 · 471 阅读 · 0 评论 -
CodeForces830B【树状数组+线段树】
思路: 就是 你好像就是要维护一下,你pop的当前值与之前的pop值的位置之间有多少个要移一移,然后算一下,然后就变成了模拟。。 线段树维护 值 和 位置,树状数组维护已经取了没有。 7 6 3 1 5 4 4 3代码:#include<bits/stdc++.h>using namespace std;typedef long long LL;const int INF = 0原创 2017-07-28 15:22:18 · 459 阅读 · 0 评论 -
Codeforces854D【数据结构-线段树】
只要相差k天,然后来的航班取个小的,去的航班取个小的就是答案; 先维护去的航班第p天开始能使所有地点都能到达的最小值,拿线段树维护最小值,然后枚举来的航班得出答案。#include <bits/stdc++.h>using namespace std;#define mem(a, b) memset(a, b, sizeof(a))#define lson num<<1,Left,Mid#原创 2017-09-14 16:09:18 · 555 阅读 · 0 评论 -
Lightoj1120线段树扫描线【模板】
算是最基础的线段树扫描线了把。注意横坐标区间如果是[1, 3]实际长度是2,维护是两个点而不是3个。#include<stdio.h>#include<string.h>#include<math.h>#include<queue>#include<vector>#include<map>#include<set>#include<algorithm>#include<list>u原创 2017-11-16 18:27:40 · 375 阅读 · 0 评论 -
lightoj1087 【线段树】
题意:给你n个数,然后给你q个询问,有两种询问:a: 表示在右边插入一个数c:表示从左边拿出一个数,然后输出;思路:一开始在想,自己手上的黑科技:线段树和树状数组线段树上的操作:求区间最大,没说区间第几个啊;树状数组:搞一发前缀和,妈个鸡,树状数组还需要知道下标和位置;还有什么:数组,感觉黑科技没什么了;然后。。。线段树维护区间有多少个数,好像很原创 2016-11-18 19:39:43 · 473 阅读 · 0 评论 -
hdoj1166【线段树】
单点更新+区间求和 不多说,直接上渣code………#include<cstdio>#include<iostream>#include<string.h>#include<algorithm>using namespace std;const int N=50007;struct st{ int left,right; int w;};st q[N*4];int n原创 2016-08-04 08:47:42 · 400 阅读 · 0 评论 -
POJ3264【线段树】
求区间最值…(基础,继续) code………..#include<cstdio>#include<iostream>#include<string.h>#include<algorithm>using namespace std;const int N=50007;struct st{ int left,right; int mina; int maxa;};s原创 2016-08-04 09:42:08 · 567 阅读 · 0 评论 -
hdoj1698【线段树Lazy操作】
区间更新lazy操作一发。#include<cstdio>#include<iostream>#include<string.h>#include<algorithm>using namespace std;/*DOTA中屠夫的钩子有N个链子组成,每个链子可有金,银,铜,三种材质做成,铜链价值1,银价值2,金价值3,先对钩子进行Q次的更新操作,求出更新完后钩子的价值。*/const int原创 2016-08-04 10:47:13 · 489 阅读 · 0 评论 -
hdoj4027【线段树】
题意: 给你一个序列,然后给出m个命令, 每个命令有两种:①:在区间内实现开方;②:求一个区间和; 思路: 一开始没思路啊,这个开方又不像加加减减一起来就好了,开方只能自己玩啊,但是仔细一想一个数也才开8次还是7次,那么直接暴力一发就好了。。。中间判断一下区间值是不是已经都是1了,直接返回就好了。能暴力的话,咱就随便搞搞就好啦 一开始还建树出错了,感觉不对就直接把树输出来看看是不是挂了。。原创 2016-08-04 16:01:54 · 492 阅读 · 0 评论 -
线段树萌新讲解+一道水题【一点一滴】
题意: 略 思路: 线段树两个基本操作,区间求最值,修改某个值并且更新。 high一high线段树啦,很简单的啦~~~~哈哈哈哈哈哈哈哈哈哈哈哈#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;const int INF=-0x3f3f3f3f;co原创 2016-08-03 10:29:47 · 622 阅读 · 0 评论 -
hdoj1540 【线段树的表示】
大牛blog 这题的题解写给自己看…… 总结(瞎扯一点): 之前只会思考,len,sum,然后GG,如果只是sum和len的去用的话,就是在mid的时候会GG。然后这次也是参考大牛的写法,其实还是蛮简单的,写完以后觉得。。。直接搞两个左边连续,右边连续,然后区间最大,直接弄弄就好了,但是具体实现,如果没有很多的练习,绝对是错误百出啊! 先讲小东西: ①:建树,以后再根据自己的瞎瘠薄在挑战上原创 2016-08-07 17:14:03 · 479 阅读 · 0 评论 -
51nod1174【基于线段树的RMQ】
很基础啊~#include <bits/stdc++.h>using namespace std;typedef long long LL;const int INF=-0x3f3f3f3f;const int N=1e4+10;struct asd{ int left; int right; int w;};asd q[N*4];void Build(int num原创 2016-09-09 17:41:40 · 497 阅读 · 0 评论 -
51nod 1272【二分+RMQ】
思路: 这题不能说是长见识,倒是第一次写这么富有套路的题,倒着来,二分区间嘛,这个很简单啊,二分的条件查询一个当前区间的最小值是不是比那个特定的值小,一步步缩小,这就是二分嘛,然后查询用线段树的RMQ写法搞,logn。 二分的模型是0000000111111111这个,窝还是照着自己的两篇小博客写的,一个是线段树,一个是二分。。。然后过的///希望熟能生巧吧#include <stdio.h>原创 2016-08-31 23:08:16 · 375 阅读 · 0 评论 -
Codeforces482B【线段树构造】
题意: 有M个限制,每个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是否有满足的数列。 思路: 看到大牛说是线段树,线段树对于区间操作,印象中乘啊,+啊,-啊都不错,但是并没有就是对于这个位运算就不懂了; 这题的题意就是构造,大致思路是 每条限制是对于每个区间处理就是或上q(可以保证相应的二进制一定是1),然后用线段树处理完m个限制,最后还要询问一下m个限制是否满足;原创 2016-09-13 20:05:34 · 720 阅读 · 0 评论 -
hdu5443 【线段树】
题意: 略 思路: 暴力是可以的O(1e7),这里采用线段树,线段树区间查找O(logn)#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;const int INF=-0x3f3f3f3f;const int MAXN=200000;struct s原创 2016-09-02 18:00:06 · 393 阅读 · 0 评论 -
HDU 1556【线段树区间更新】
这篇lazy讲的很棒: https://www.douban.com/note/273509745/ if(tree[rt].l == l && r == tree[rt].r) 这里就是用到Lazy思想的关键时刻 正如上面说提到的,这里首先更新该节点的sum[rt]值, 然后更新该节点具体每个数值应该加多少即add[rt]的值, 注意此时整个函数就运行完了,直接return,而不是还继续原创 2016-09-15 20:28:50 · 327 阅读 · 0 评论 -
hdu5861【线段树】
题意: 有n个点,每个两两之间有一条路,给出每条路开放的花费,每条路只能打开关闭一次,然后m天里给出一个区间代表这条路必须在该天开放,求每天需要的花费。 思路: 这是一题纯粹用线段树搞的题。 我们可以看到:某第i个区间[s1,t1]的打开,如果存在第k(1<=k< i)个区间[s2,t2] (s2 >=s1 , t1>=t2),那么第k区间的所有路必须在[ k , i]时间段内打开。因为一旦原创 2016-09-23 08:23:23 · 396 阅读 · 0 评论 -
51nod 1376【线段树维护区间最大值】
引自:wonter巨巨的博客定义 dp[i] := 以数字 i(不是下标 i)为结尾的最长上升长度然后用线段树维护 dp[i]:每个节点维护 2 个信息,一个是当前区间的最大上升长度,一个是最大上升长度的方案数,这里再详细说下这篇题解。。。也是弱弱自己的理解吧。。。以1-n的值为线段树所代表的区间;然后依次更新,题目就是要找上升序列,那么我们只要每次查询0~arr[原创 2016-10-28 12:47:44 · 526 阅读 · 0 评论 -
Lightoj1093 【线段树】
题意:给出n个数,然后对于D区间的数求一个最大差值思路:区间最大最小。。。我居然没想到线段树。。。#include using namespace std;typedef long long LL;const int N=1e5+10;struct SegT{ int left; int right; int mid; int tmin,t原创 2016-11-17 21:19:47 · 394 阅读 · 0 评论 -
POJ2777【线段树】
一直以来就是这么写,很稳。 大晚上先贴个代码吧,下次给加注释。const int Maxn = 1e5 + 10;struct Seg{ int Left, Right; int col; int _col;}node[Maxn<<2];void pushUp(int num){ node[num].col = node[num<<1].col|node[num<原创 2017-11-27 00:32:16 · 458 阅读 · 1 评论