随笔分类 -  数据结构--线段树/树状数组

摘要:做法:总体想法是求出一个矩形的面积以及它所包含的矩形,然后用自己的面积减掉所包含的。主要问题是怎样求解它所包含的矩形。因为是没有相交点的,可以利用扫描线的方法去做,类似染色,当前段如果是x色,也就是第x个矩形,那么再把他染成y颜色时,说明x包含y,而当扫到y的上边时,这一段又恢复到x色。标记一下被包... 阅读全文
posted @ 2014-06-07 10:30 _雨 阅读(257) 评论(0) 推荐(0)
摘要:链接刚开始看n挺小,以为是二维的线段树,想了一会也没想到怎么解,之后看到z值非常小,想到可以直接枚举z,确定一个坐标,然后把三维转化为二维,把体积转化为面。枚举z从-500到500,然后用面积并的解法求出单位z坐标上满足题意的面积。把1写成了L,查错查了好久。其余还好,1A。求覆盖超过两次的面积,u... 阅读全文
posted @ 2014-06-06 20:17 _雨 阅读(206) 评论(0) 推荐(0)
摘要:链接分别求出7种颜色覆盖的面积。做法:每种颜色设定一个标号,以二进制表示R:100 G:010 B:001 。这样很明显可以知道RG:110 GB:011 以此类推。求解时,需要开一个二维标记数组,标记了这一段的某种颜色被标记了几次,然后类似状压的方式求解。 1 #include 2 #inc... 阅读全文
posted @ 2014-06-05 21:56 _雨 阅读(181) 评论(0) 推荐(0)
摘要:因为要求覆盖两次的面积,所以可以开二维表示被覆盖1次及以上和被覆盖两次及以上的面积。主要在up更新上,如果当前区间被标记为一次,二次覆盖的面积就为其儿子面积之和,具体看代码吧。 1 #include 2 #include 3 #include 4 #include 5 #include ... 阅读全文
posted @ 2014-06-05 21:52 _雨 阅读(436) 评论(0) 推荐(0)
摘要:很早以前做过这题,早就没印象了,估计当时也是照着某大神的代码抄过的,现在是连题意都看了好长时间。刚开始的S集合是空集,给你一些操作和一个T集合,把操作的结果再赋给S集合。解法:因为会有开区间和闭区间,对于一个值我拆成了两个点 比如 1,2,3, 表示的区间为[1,2] 把两个端点值分别设为2个点,把... 阅读全文
posted @ 2014-06-03 20:03 _雨 阅读(352) 评论(0) 推荐(0)
摘要:题目要求求某段区间第一个没有出现的数(0,1,2,3.。。。) ,对于所有的区间,我们把这样的数加起来最后得到一个结果。首先,我们要求出这样的数,然后还得列举出所有的区间,复杂度太大了。换种思路,我们定住L,是不是一次性能求出所有的R所得出的结果,这就用到线段树的性质了,因为在移动L的过程中,移一步... 阅读全文
posted @ 2014-06-03 16:03 _雨 阅读(759) 评论(0) 推荐(0)
摘要:这里以3次方来举例讲一下这题的做法,其它维类似。如果要求某一个值的3次方那么sum = t^3,设t = x+y。那也就是sum = (x+y)^3.假如我让每个数都加z t = x+y+z,我可以让新的y = y+z,这里发现新来的总会加在y上,那么可以给他一个延迟,slz,那么新的值t = t ... 阅读全文
posted @ 2014-06-03 09:38 _雨 阅读(524) 评论(0) 推荐(0)
摘要:求一部分和的线段树,因为是对5取余,所以给定一段区间a-b,假设其位置会有变化,最多会有5种和,那么就可以保留这五种和,在用lz进行延迟标记时,保存位置变化了多少也就知道了该从当前和转到哪一个和。当时把lz标记那么部分写成覆盖了,应该是+=,WA了两次。 1 #include 2 #inclu... 阅读全文
posted @ 2014-06-03 09:22 _雨 阅读(239) 评论(0) 推荐(0)
摘要:线段树的一些基本应用,就是函数写了很多,有点繁琐。以每个物品的单价建树,刚开始写了个裸的想水过去直接MLE了,然后又离散化了下。离散化单价后建树,lz数组用来清零,s数组保存结点所含物品个数,co数组保存结点所含物品的所有花费,以找第k大的方式找到第n个物品所在的结点位置i,求出前i-1个结点所包含... 阅读全文
posted @ 2014-06-03 00:04 _雨 阅读(330) 评论(0) 推荐(0)
摘要:有一点类似区间K值的求法。这里有两颗树,一个是自己建的线段树,一个是题目中给定的树。以线段树和树进行区分。首先离散化一下,以离散化后的结果建线段树,线段树的节点开了2维,一维保存当前以当前节点为权值的树的节点是往左走的,另一维是往右走的,用一个vector保存一下以当前i节点为结束的询问,因为所有的... 阅读全文
posted @ 2014-06-02 16:05 _雨 阅读(370) 评论(0) 推荐(0)
摘要:链接poj3667的加强版 当时的题解这里只不过对于女神需要另开算,DS的占用的时间不加在女神身上,女神的时间都要加,清空的时候也都要算。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #inc... 阅读全文
posted @ 2014-05-29 21:48 _雨 阅读(398) 评论(0) 推荐(0)
摘要:以前见过这题,没做出来,知道是离线处理,这次仔细想了下,首先把出现的高度都map离散化一下,以离散化出来的数目g建树,把每个位置都开俩个vector,一个存以这个位置为L的询问,一个存以这个位置为R的询问。然后从1-g 进行更新,假如当前i是以第j个区间的开始位置,那么这时就可以询问一下 2 #i... 阅读全文
posted @ 2014-05-29 16:15 _雨 阅读(196) 评论(0) 推荐(0)
摘要:链接算是裸线段树了,因为没个数最多开63次 ,开到不能再看就标记。查询时,如果某段区间被标记直接返回结果,否则继续向儿子节点更新。注意用——int64注意L会大于R 这点我很纠结。。您出题人故意的吗 WAn次。。 1 #include 2 #include 3 #include 4 #in... 阅读全文
posted @ 2014-05-29 14:41 _雨 阅读(171) 评论(0) 推荐(0)
摘要:链接这题意甚是难懂。。当且峰值为h 如果他能为ultras 需要满足条件 d>=15W d满足它到任意一个比它高的点须经过h-d这个点通俗一点来说,如果这个点满足条件 就找离他最近的一个 2 #include 3 #include 4 #include 5 #include 6 #incl... 阅读全文
posted @ 2014-05-02 19:21 _雨 阅读(348) 评论(10) 推荐(0)
摘要:链接表达式类似于斐波那契 但是多了一个变量 不能用快速幂来解 不过可以用线段树进行维护对于每一个点够一个2*2的矩阵1 a[i]1 0 这个矩阵应该不陌生 类似于构造斐波那契的那个数列 还是比较容易能想到的然后就用线段树进行维护 注意矩阵不满足交换律 在乘的时候要倒序。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 using namespace std; 11 #define N 100010 12 #define... 阅读全文
posted @ 2014-04-06 20:16 _雨 阅读(185) 评论(0) 推荐(0)
摘要:链接这题最不好求的一部分是rank部分 因为top每次都是把一个数放在队头 不会穿插在数组里 也就是说后面没有top过的一部分数 依旧保持有序这样可以分为两部分来处理 比如 1 2 3 4 5 6 7 TOP 3 TOP 5 TOP 7后 会是这么一种状态 7 5 3 1 2 4 6 这样可以建立两颗线段树一个处理前面一个处理后面对于N 值很大 肯定是需要离散化的 前面的那颗就可以用普通的求第k大 标记 求和来求出第几 以及x在哪个位置 后面的线段树的值 可以这么来表示 s[w] = num[i]-num[i-1]这样对于询问rank x 就用线段树找第一个大于等于x的数。虽然错了很多次,看. 阅读全文
posted @ 2014-03-26 18:22 _雨 阅读(203) 评论(0) 推荐(0)
摘要:题不怎么难,按线段树的解法 就是延迟标记,更新 因为找错找了N久 记一篇吧向下更新时把+=写成了= 还做在了2W组的数据上 那个错找得真费劲。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define N 20001210 int n;11 #define LL long long12 LL s[N=r)31 {32 s[w]+=(r-l+1)*d;33 lz[w]+=d;34 ... 阅读全文
posted @ 2014-01-12 02:14 _雨 阅读(205) 评论(0) 推荐(0)
摘要:读错题意了。。线段树延迟标记白刷这么多线段树 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 300010 9 int s[N=r)17 {18 s[w] = p;19 return ;20 }21 if(s[w])22 {23 s[w>1;27 if(am)30 update(a,b,p,m+1,r,w>1;39 if(k= 1; i-... 阅读全文
posted @ 2013-10-16 08:43 _雨 阅读(281) 评论(0) 推荐(0)
摘要:1650简单题 线段树的单点更新 就是字符串神马的 有点小繁琐 开两个map 一个存城市 一个存名字 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define N 60010 10 #define LL long long 11 LL s[Nq; 14 mapqq; 15 char pq[N][25]; 16 struct node 17 { 18 int d; 19 char s1[25]; 20... 阅读全文
posted @ 2013-10-01 21:36 _雨 阅读(452) 评论(0) 推荐(0)
摘要:1316我想说 要不要这么坑 WA了一个小时啊 ,都快交疯了,拿着题解的代码交都WA 最后很无语的觉得题解都错了 重读了N遍题意 发现没读错啊 难道写题解的那个人和我都想错了??最后把g++换个C++交吧 就这么A了 我#¥#%。。这个题有要注意的地方 WA6 取整的地方要那样处理(看代码) 具体我也不知道为什么 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1000000 9 #define LL long long10 #define. 阅读全文
posted @ 2013-10-01 18:26 _雨 阅读(353) 评论(0) 推荐(0)