线段树
jiangjiashi
这个作者很懒,什么都没留下…
展开
-
Atlantis(H1542)
解二: 可以把相互重叠的块都切割出来,一个小块一个小块的计算面积的总和就行了. 解一: 这个方法不是线段树的,先放这吧,用线段树做出来后再编辑, 其中的map[ ][ ]很好,, #include #include #include #include #include #include #include #include #include #includ原创 2012-05-07 11:23:46 · 352 阅读 · 0 评论 -
更新一点,查寻任意一段中子串的最大和
#include #include #include using namespace std; #define N 100001 struct my { int left,right; int lm,rm,m,sum; }t[N*4]; int n,m; int go[N]; int pre,ans; void build(int cur,int left,int right) { t原创 2014-04-30 16:35:53 · 711 阅读 · 0 评论 -
炸弹
题意:在一些坐标上有一些炸弹。。有两个操作 1、移动炸弹,,把一个炸弹从一个坐标移到另一个坐标。 2、询问一段坐标中所有炸弹坐标中大坐标减去小坐标。 思路:离散化,把所有可能出现的坐标点找出来排好序后,去重。 把所有坐标都映射到他所对应的在数组的索引号,用map实现。 用res记录段的坐标差和,s原创 2013-05-11 15:51:44 · 643 阅读 · 0 评论 -
字符串匹配
题意:给出一个字符串,只有 ( ) 这两种,有三种操作 1、query查找一段字符里的括号是否匹配 2、set一段字符为某一种 3、reverse 把一段中的括号都变为其反 解法:用1表示该位置的'(' ,-1表示')' 线段树中的重要变量sum-和,lmin该段所有前缀中最原创 2013-05-10 16:37:58 · 497 阅读 · 0 评论 -
(找区间段长)hotel
CD 题意:有N个客房,随时来K个人,必须要有连续K个房他们才入住。 另一个操作便是清空一段客房的房客。 思路:用线段树t[left,right]来维护每一段的lmax,smax,rmax(左连续空,右连续空,所有连续的最大空房)。 pushDown,,pushUp,见程序 #include #include using namespace原创 2013-05-10 09:07:57 · 1002 阅读 · 0 评论 -
(线段树+kmp) 1828
题意:给出一个字符串,有一些字母是喜欢的,有些不喜欢。 求出这个串的连续子串中不喜欢的长度不超过K的数目,其中重复的子串只算一个 思路:先是用线段树来记录每段字符串中不喜欢字母的个数。 用KMP的前一部分来处理子串的的每一段,,找到前面已经有该子串的 注意:要把判断子串的if放在find()外面,这样就减少了很多不必要的f原创 2013-05-08 16:42:20 · 657 阅读 · 0 评论 -
(找到一段中最大) 种蘑菇(CD)
题意:更新一段,,同时加K 询问一段中最大值是多少。 注意更新就行了,,线段树中的每一段表示该段的最大值。 #include #include using namespace std; #define N 1001000 int n,q; int go[N]; struct my { int left,right; int mid; long lo原创 2013-05-04 10:53:00 · 592 阅读 · 0 评论 -
(找到最小 ) CD
题意 :给一片楼照相,现在然后把照片剪成N片, 第i片中的楼高度为,,求出相片中最少的楼的数目。 思路:用线段树维持一段中的最小高度。 建好树后,对数入的数和其ID同时排序,并把相同高度的ID也是由小到大的排序。 从开始遍历,如果是相邻两段的高度相同并且其之间段的最小高度都大等于其高度,则认为他们是同一个楼的。原创 2013-05-04 12:15:35 · 1031 阅读 · 0 评论 -
(单纯的懒操作) a simple problem with integers (P3468)
一开始写的时候就没有太注意更新 的部分,, 注意:要一直保留向下的更新, 要回溯更新。 #include #include using namespace std; #define N 100010 int n,q; int go[N]; struct my { int left,right; int mid; long long valu原创 2013-05-04 10:16:52 · 535 阅读 · 0 评论 -
(最原始) Balanced Lineup (P3264)
题意:给出一段数列,询问从i到j之间的最大值与最小值之差。 方法:就是用线段树分别存每段之间的最大值、最小值。然后作差即可。 注意:由于有些时间没有写线段树了,现在出现了一些问题。终于还是以比较低的时间过了 1、注意l , r 与 中间值之间的查找关系。 #include using namespace std; #define N 50010 #原创 2013-04-18 23:02:11 · 531 阅读 · 0 评论 -
Billboard (H2795)
用简单的线段树就差不多。 第一段L到R排之间记录的是之中有空余量最大的值。 #include #include #include #include #include #include using namespace std; #define N 200010 int tr[N]; int h,w,n; void build(int v,int l,int r,i原创 2013-01-15 11:50:21 · 443 阅读 · 0 评论 -
(线段树+离散化) Mayor's post(P2528)
这个题用了我很多的时候,了解的线段树很肤浅,做一道简单题就这样了。 我的思路是:先离散化把给出的数据重新排序后得到一个排序数做为新的数据(不过这样有缺陷:有一些线段会被忽略掉,不过这个题就是要这样做,OJ上的数据也能过) 然后倒着给出的点查找该段里是不是已经贴满。再更新此段,第一个点上的数值为1 注意:这是又点,所以空间要开大,建树时也要用2倍多一原创 2012-07-14 15:55:30 · 545 阅读 · 0 评论 -
(二维线段树) Matrix (P2155)
这个题可以更简单快捷地用二维数状数组解出。,自己写了很多,各种冲突,还是先转一个吧, #include #include #include using namespace std; const int N=1010; int n,m,ans; struct newtree{ int left转载 2012-07-15 15:43:19 · 407 阅读 · 0 评论 -
Atlantis(P1151)
先用好像不是线段树的方法模仿做出,,然后再做一下线段做的方法吧 #include #include #include #include #include #include #include #include using namespace std; #define N 333 struct my { int i; double num; bool operator<(my原创 2012-07-11 17:05:43 · 439 阅读 · 0 评论 -
(简单)color the ball(H1556)
这个题可以用数状数组做,(有的).而且效率会更高一点点. //其实以前学习的是不用struct 的一种,那样传参数会比较麻烦,效率会低一点, #include #include #include #include #include #include #include #include #include #include #include #include #include using原创 2012-05-06 23:04:06 · 372 阅读 · 0 评论 -
老师在DHL(CD1037)
这个方法很巧妙,(其实还可以用线段树,) 知道map[ ][ ]里的情况就明白了. #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define原创 2012-05-07 11:06:04 · 771 阅读 · 0 评论 -
二维坐标中一个移动矩形块中的最大和值
题意: 在一个二维坐标中有很多个点,每个点有个权值。 给出一个矩形框的宽与高原创 2014-05-04 19:18:00 · 1092 阅读 · 0 评论