随笔分类 -  线段树及树状数组

HDU 3397 Sequence operation 线段树
摘要:再做一道线段树。http://acm.hdu.edu.cn/showproblem.php?pid=3397这题还是很有意义的,其特殊之处在于操作2和操作4.操作2是0变1,1变0,这样在pushdown的时候就不能简单覆盖下去,因为如果孩子节点有操作没有完成,会导致结果错误。但是又不能遇到操作2就把子节点也pushdown,这样会超时。。。需要想点办法。。。所以观察一下操作2的效果,可以得出如下结论:当字节点操作未做操作为1时,将操作2pushdown下来等同于将字节点进行0操作同理,字节点未做操作为0时,等同于1操作;当字节点未做操作为2时,等同于什么也不做;字节点没有未做操作时,直接覆盖 阅读全文
posted @ 2012-05-12 10:53 NKHe!!oWor!d 阅读(244) 评论(0) 推荐(0)
2012金华邀请赛D题(POJ4047 Garden)解题报告
摘要:金华邀请赛D题,现场lazy标记推错了,颇为不爽,重做一下。给出一个N个数的序列以及一个k(0<k<=n<=200000),m个操作p,x,y,其中p=0:将x位置的数替换为yp=1:将x y位置的数互换p=2: 查询x-y位置区间连续k个数的和的最大值很快可以想到用O(n)的复杂度预处理,将从i位置起始连续k个数的和求出来,那么对于查询操作,就变为查询和数组中x~y-k+1这个区间里的最大值。再看对于前两种操作,第二种可以等效于两次第一种操作。对于第一种操作,将x位置由y0替换为y,变化量det=y-y0,这个变化量会对和数组产生怎样得影响呢?很明显会导致和数组的x-k+1 阅读全文
posted @ 2012-05-11 21:25 NKHe!!oWor!d 阅读(587) 评论(0) 推荐(0)
POJ 1177 求矩形并的周长和
摘要://9379850 NKHelloWorld 1177 Accepted 1716K 16MS G++ 1663B 2011-10-01 14:48:33//9379852 NKHelloWorld 1177 Accepted 1492K 32MS C++ 1663B 2011-10-01 14:48:42/*POJ 1177 求矩形并的周长和分横边和竖边分别计算,求和,用到了线段树*/#include <cstdio>#include <algorithm>using namespace std;const int MAXN=5000+10,MAXR=20000+5; 阅读全文
posted @ 2011-10-01 14:53 NKHe!!oWor!d 阅读(222) 评论(0) 推荐(0)
POJ 3277 City Horizon(矩形面积并)
摘要://9379522 NKHelloWorld 3277 Accepted 10480K 344MS G++ 2018B 2011-10-01 13:05:08//9379524 NKHelloWorld 3277 Accepted 9940K 454MS C++ 2018B 2011-10-01 13:05:21//可以转化为矩形面积交的问题,只是矩形下方的边都在x轴上,套用模板1A#include <algorithm>#include <iostream>#include <cstdio>#define MAXN 40010using namespace 阅读全文
posted @ 2011-10-01 13:08 NKHe!!oWor!d 阅读(238) 评论(0) 推荐(0)
POJ 1151 Atlantis(线段树+扫描线+坐标离散求矩形面积并)
摘要:/*POJ 1151 Atlantis 求矩形面积并,线段树+扫描线法http://hi.baidu.com/legend_ni/blog/item/106e9f8a34ff9b04b21bba71.html线段树经典应用,求矩形并的面积把每个矩形投影到 x 坐标轴上来(投影到 y 轴上去也是可以的,投影到 x 轴上去的话,就相当于矩形是竖着切的)然后我们可以枚举矩形的 x 坐标,然后检测当前相邻 x 坐标上 y 方向的合法长度,两种相乘就是面积然后关键就是如何用线段树来维护那个 “合法长度”线段树的节点这样定义struct node { int left,right,cov; double 阅读全文
posted @ 2011-10-01 12:34 NKHe!!oWor!d 阅读(612) 评论(0) 推荐(0)
POJ 1389 Area of Simple Polygons(线段树+扫描线求矩形面积并)
摘要://9379418 NKHelloWorld 1389 Accepted 296K 16MS C++ 1997B 2011-10-01 12:31:16//9379419 NKHelloWorld 1389 Accepted 844K 0MS G++ 1997B 2011-10-01 12:31:31/*POJ1151的整数简化版本,套用模板1A*/#include <algorithm>#include <iostream>#include <cstdio>using namespace std;#define L(x) ( x << 1 )# 阅读全文
posted @ 2011-10-01 12:33 NKHe!!oWor!d 阅读(254) 评论(0) 推荐(0)
POJ 2155 Matrix(快)(二维线段树段更新求点和)(不保存left,right域)
摘要://9375794 NKHelloWorld 2155 Accepted 56540K 1875MS G++ 3187B 2011-09-30 13:15:25//9375796 NKHelloWorld 2155 Accepted 56324K 1750MS C++ 3187B 2011-09-30 13:15:32//以上为普通二维线段树段更新求点和解法//以下为加入位运算和不保存lt和rt的结果//9375996 NKHelloWorld 2155 Accepted 9140K 782MS C++ 2523B 2011-09-30 14:07:56#include <cstdio& 阅读全文
posted @ 2011-09-30 14:16 NKHe!!oWor!d 阅读(233) 评论(0) 推荐(0)
HDU 1823 Luck and Love(二维线段树)
摘要://4681418 2011-09-30 12:26:14 Accepted 1823 140MS 7520K 3762 B C++ nkhelloworld//4681419 2011-09-30 12:26:40 Accepted 1823 203MS 7588K 3762 B G++ nkhelloworld/*二维线段树,一个线段树中套一个线段树,求区间最大值再次强调要注意区间范围是不是反着的,如h1 > h2时应swap注意读入浮点数的时候可能产生精度误差,*10再转int可能就错了此题,如果不加eps,在C++下可以AC,在G++下是WA*/#include <cstd 阅读全文
posted @ 2011-09-30 12:44 NKHe!!oWor!d 阅读(174) 评论(0) 推荐(0)
HDU 2871 Memory Control (恶心线段树,HOTEL加强版)
摘要://4677952 2011-09-29 17:10:55 Accepted 2871 421MS 3700K 5156 B G++ nkhelloworld//4677960 2011-09-29 17:11:58 Accepted 2871 281MS 3628K 5156 B C++ nkhelloworld/*POJ上Hotel的加强版,多了Get操作,Free操作有一些变化。用vector记录已经开出来的内存,维持有序,遇到get和free二分查找*/#include <cstdio>#include <iostream>#include <vector 阅读全文
posted @ 2011-09-29 17:16 NKHe!!oWor!d 阅读(306) 评论(0) 推荐(0)
POJ 3667 Hotel(线段树进阶,内存分配问题)
摘要://9372104 NKHelloWorld 3667 Accepted 3740K 1000MS G++ 3738B 2011-09-29 15:06:22//9372139 NKHelloWorld 3667 Accepted 3228K 594MS C++ 3740B 2011-09-29 15:12:45/*转自:http://www.cnblogs.com/superbin/archive/2010/07/18/1780194.html题型:线段树(设计并维护复杂域)描述:旅店登记,1.找一段最靠前的连续w个空房间;2.退订[x,x-d+1]段的房间。思路:1. 域的设计struct 阅读全文
posted @ 2011-09-29 15:40 NKHe!!oWor!d 阅读(357) 评论(0) 推荐(0)
HDU 4027 Can you answer these queries (线段树求和)
摘要:/*一个10^5的序列,有10^5个操作,每个操作为a,b,ca=0时将b到c区间内的数都开根号下取整,a=1时求b到c段的和其中所有数的和不超过2^63。可以发现所有的数最多开7次方,就会变成1了,再开方就不变了。所以定一个标记allone表示这一段已经全是1了,以后的开房遇到allone为true就不向下进行了,提高效率。线段树求和的变型,线段树提高效率的关键在于寻找合适的lazy标记,到满足一定条件的时候就不继续更新到点。*注意在HDOJ里,64位整数,定义用__int64或longlong,输入输出只能用%I64d*///4675978 2011-09-29 08:46:46 Acce 阅读全文
posted @ 2011-09-29 11:18 NKHe!!oWor!d 阅读(176) 评论(0) 推荐(0)
HDU 1394 Minimum Inversion Number(线段树求逆序对数)
摘要:/*HDU1394 利用线段树求逆序对数方法:从1……n插入每个数,每插入一个数,计算当前线段树中数为a[i]+1....maxval的数有多少个,特别需要当心a[i]+1有可能大于maxval的情况交换两个相邻数,逆序数+1或-1, 交换两个不相邻数a, b, 逆序数+=两者间大于a的个数-两者间小于a的个数对于本题,可以假设在第n+1个位置上有一个数n,每次将第一个数与第n+1位置上的n互换逆元对数 = 原逆元对数 - 比该位置数小的个数 + 比该位置大的个数*///4673112 2011-09-28 18:46:40 Accepted 1394 78MS 240K 1470 B G++ 阅读全文
posted @ 2011-09-28 19:03 NKHe!!oWor!d 阅读(364) 评论(0) 推荐(0)
HDU 1698 Just a Hook (线段树 求和问题)
摘要://4671914 2011-09-28 15:07:14 Accepted 1698 843MS 3260K 1905 B G++ nkhelloworld//4671915 2011-09-28 15:07:18 Accepted 1698 453MS 3304K 1905 B C++ nkhelloworld//线段树解决,近似序列求和问题,简单/*一个N<=100000个数组成的序列,最多做Q<=100000次操作,每一次操作由a,b,c组成,意思是将[a,b]区间的值修改为c,求经过Q次操作后序列的总和*/#include <cstdio>#define MA 阅读全文
posted @ 2011-09-28 15:12 NKHe!!oWor!d 阅读(230) 评论(0) 推荐(0)
HDU 1754 I Hate It 线段树 RMQ 支持修改数列的值
摘要://http://acm.hdu.edu.cn/showproblem.php?pid=1754//4671581 2011-09-28 14:15:02 Accepted 1754 265MS 6452K 2127 B G++ nkhelloworld//4671584 2011-09-28 14:15:21 Accepted 1754 218MS 6388K 2127 B C++ nkhelloworld//以下是未加输入优化的测试结果,对比发现效率提升很大//4671535 2011-09-28 14:08:36 Accepted 1754 1109MS 6444K 2029 B G++ 阅读全文
posted @ 2011-09-28 14:25 NKHe!!oWor!d 阅读(212) 评论(0) 推荐(0)
HDU 1166 敌兵布阵 树状数组解法
摘要://http://acm.hdu.edu.cn/showproblem.php?pid=1166//4671122 2011-09-28 13:02:52 Accepted 1166 31MS 412K 1396 B C++ nkhelloworld//4671125 2011-09-28 13:03:32 Accepted 1166 62MS 376K 1396 B G++ nkhelloworld//树状数组点更新求和,比线段树要快#include <cstdio>#include <cstring>const int maxn = 50002;int BITtre 阅读全文
posted @ 2011-09-28 13:41 NKHe!!oWor!d 阅读(165) 评论(0) 推荐(0)
HDU 1166 敌兵布阵 线段树 点更新
摘要:点更新线段树问题//4671028 2011-09-28 12:40:35 Accepted 1166 78MS 1720K 2395 B G++ nkhelloworld//4671030 2011-09-28 12:41:04 Accepted 1166 46MS 1764K 2395 B C++ nkhelloworld//点更新线段树#include <cstdio>#define MAXN 50000struct SEGMENTTREE{ int left,right,sum;}tree[MAXN*4];int n;void buildsegtree(int pos,in 阅读全文
posted @ 2011-09-28 13:38 NKHe!!oWor!d 阅读(135) 评论(0) 推荐(0)
POJ 2528 Mayor's posters 线段树 着色问题
摘要://9368182 NKHelloWorld 2528 Accepted 1180K 79MS C++ 2792B 2011-09-27 22:07:26//9368188 NKHelloWorld 2528 Accepted 1712K 63MS G++ 2792B 2011-09-27 22:08:48#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;struct STNODE//线段树中的节点{ int 阅读全文
posted @ 2011-09-27 22:51 NKHe!!oWor!d 阅读(176) 评论(0) 推荐(0)