ACM-数据结构 线段树&&树状数组
文章平均质量分 79
黄小豪被虐惨了
这个作者很懒,什么都没留下…
展开
-
hdu 1754
题目PushUp是改为求其最大值,update是单点值的替换#include#includeusing namespace std;#define maxn 200005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define inf 1<<30struct Tree{ int l,r,num;}tree原创 2013-06-08 21:20:57 · 534 阅读 · 0 评论 -
hdu 1806
题目区间合并。当update的时候注意所查询边界是与左右儿子的边界进行比较代码如下:#include#includeusing namespace std;#define maxn 100005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct node{ int r,l; int mnum,ms原创 2013-07-21 09:16:29 · 764 阅读 · 0 评论 -
poj 3264
题目一个线段树的水题。用RMQ水了一个。时间比线段树快乐将近0.5s,但空间大了很多线段树代码如下:/* Memroy 2740K Time 4016Ms*/#include#includeusing namespace std;#define maxn 50005#define lson rt<<1#define rson rt<<1|原创 2013-07-21 09:21:16 · 609 阅读 · 0 评论 -
hdu 4217
题目区间内第k小数,求其和。代码如下:#include#includeusing namespace std;const int maxn= 262147;struct Tree{ int l,r; int sum;}tree[maxn<<2];inline void PushUp(int rt){ tree[rt].sum=tre原创 2013-07-30 11:09:28 · 795 阅读 · 0 评论 -
hdu 3911
题目一直在用3397的现有代码去掉功能来代入这道题但是莫名的TLE了。于是按照网上大部分的方法,多维护了黑色的左,中,右连续1之和由于PushDown的时候忘记了把延迟标记传递下去,又贡献了几次WA最后在输入加速和inline的帮助下,成功600ms AC代码如下:#include#includeusing namespace std;#define maxn原创 2013-07-23 23:51:23 · 698 阅读 · 0 评论 -
hdu 1823
题目二维的线段树。把身高区域看成x轴,活跃度看成是y轴,就找所交区域内值的最大值。把每一株线段树单独来看,很容易理解。代码中有详细解释,代码如下:#include#includeusing namespace std;#define maxn 2050struct sub_Tree{ int l,r; int val;};//子树str原创 2013-07-24 01:38:42 · 743 阅读 · 2 评论 -
poj 2777
题目用了二进制中1的个数来统计不同的颜色数最后在求解时用0来与这个数中的1或,统计颜色个数仍然是区间更新,区间询问代码如下:#include#includeusing namespace std;#define maxn 100010#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct Tree{原创 2013-07-24 10:07:50 · 536 阅读 · 0 评论 -
hdu 1166
题目重新刷,板子题。#include#includeusing namespace std;#define maxn 50005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct Tree{ int l,r,num;}tree[maxn<<2];void PushUp(int rt){ t原创 2013-06-08 21:03:33 · 489 阅读 · 0 评论 -
poj 2299
树状数组求逆序数离散化之后,每次插入一个数,在该数字的位置上加上1,即update(c[i],1)接着getSum找到比他小的数的个数,最后用i减掉即为逆序数。在纸上模拟下这个过程就很容易理解。树状数组的基本功能之后就是需找比当前位置小或者大的数shuzhuagnshuzu原创 2013-07-31 01:43:50 · 570 阅读 · 0 评论 -
poj 2352
题目树状数组求逆序数按照题目输入的顺序,只需要找出(1,x)有几个点即可,然后更新。代码如下:#include#include#includeusing namespace std;const int maxn=32005;int a[maxn];int Lowbit(int x){ return x&(-x);}void update(int原创 2013-08-02 16:05:17 · 564 阅读 · 0 评论 -
husj oj
F - InversionsTime Limit:500MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64uSubmit StatusDescriptionThere are N integers (1A[j].InputThe first line of the i原创 2013-08-02 17:30:40 · 947 阅读 · 0 评论 -
poj 1195
题目一道二维树状数组的裸题。把更新,求和函数改成二维即可求和的时候注意要getsum(x2,y2)-getsum(x1-1,y2)-getsum(x2,y1-1)+getsum(x1-1,y1-1)画图即可理解。代码如下:#include#include#includeusing namespace std;const int maxn= 1050;i原创 2013-08-03 14:44:00 · 951 阅读 · 1 评论 -
poj 2155
题目二维树状数组。由于是翻转的操作,而且是区间操作,所以以往的update和query的操作是翻过来的。update(x1-1,y1-1),update(x2,y2),update(x1-1,y2),update(x2,y1-1).画出矩形区域来模拟一下很好理解。由于只是记录是0还是1,所以在getSum中只需要模2即可。可以用二维线段树写,代码多了很多。代码如下:原创 2013-08-02 23:25:35 · 619 阅读 · 0 评论 -
poj 3067
题目还是树状数组求逆序数先按e升序,若e相等时再按s升序,每次求出比b大的数字的个数,再更新即可代码如下:#include#include#include#includeusing namespace std;const int maxn=1005;int a[maxn];int n,m,k;struct Way{ int e,s;}way[ma原创 2013-08-02 16:16:19 · 643 阅读 · 0 评论 -
hdu 1542 &&poj 1151
题目用线段树来求矩形面积并比照着其他人的代码,总算理解了。先熟悉下,代码如下:#include#include#includeusing namespace std;#define maxn 220struct Node{ int l,r; int c; double len;}node[2000];struct Line{原创 2013-07-20 14:02:00 · 635 阅读 · 1 评论 -
hdu 1540 && poj 2892
题目D 指将改点更新为0Q 查询改点处左右两端的连续区间R 将前一个D的点回复成1#include#includeusing namespace std;#define maxn 50005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct Tree{ int l,r; int lsum,原创 2013-07-18 13:24:38 · 603 阅读 · 1 评论 -
hdu 1394
题目询问每一个数中比这个数大的有多少个,然后进行更新。接着是若把一个数移动最后,则逆序数是减少a,增加n-a-1.代码如下:#include#includeusing namespace std;#define maxn 5005#define rson l,m,rt<<1#define lson m+1,r,rt<<1|1struct Tree{原创 2013-06-10 03:00:22 · 874 阅读 · 0 评论 -
hdu 2795
题目题意为在h*w的矩形方块里面贴海报,求出最左边能贴海报的区域的行数。用PushUp来维护当前可以放海报的最大值。每次贴下之后,就把num值减掉可以贴的值。注意的一点是,当海报数n比高度h小时,令h=n。#include#include#includeusing namespace std;#define maxn 200010#define lson l,m,原创 2013-07-09 09:42:14 · 555 阅读 · 0 评论 -
poj 2182
题目和poj 2828差不多的意思#include#include#includeusing namespace std;#define maxn 8010#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct Tree{ int l,r,num;}tree[maxn<<2];int p[maxn],原创 2013-07-09 23:48:10 · 541 阅读 · 0 评论 -
poj 2828
题目从后往前插入,则pos是记录前面位置的空格数。这样一个一个往前插,最终得到了最后的序列代码如下:#include#includeusing namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn=200005;int ret[maxn<<2];int ans[ma原创 2013-07-09 22:58:32 · 576 阅读 · 0 评论 -
poj 2886
题目有两点:1、每个人得到的F(p)可以用反素数来刻画,所以通过之前的预处理,把所有需要使用到的反素数全部打表给出。2、对于类似于约瑟夫环的处理,可以加入线段树的方式来刻画。线段树的两个子函数一如之前的两题。主函数部分略纠结。 借鉴点击打开链接成功AC.#include#include#includeusing namespace std;#define ma原创 2013-07-15 10:04:30 · 603 阅读 · 0 评论 -
poj 3468
题目区间更新,区间求和。多了lazy标记,更新是,把当前断更新,再把lazy标记向下更新,这就是pushdown的作用。代码如下:#include#include#includeusing namespace std;#define maxn 100005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct原创 2013-07-15 10:50:50 · 501 阅读 · 0 评论 -
poj 2528
因为数据范围过大,但每一次使用的数据却不多,所以使用离散化的方法。用负数记录起点,证书记录终点来帮助离散化。最后依靠hash的值来进行统计海报颜色的数量离散化的方法转载至地址#include#include#include#includeusing namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|原创 2013-07-15 23:32:38 · 541 阅读 · 0 评论 -
hdu 1698
A -Just a HookTime Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uSubmitStatusDescriptionIn the game of DotA, Pudge’s meat hook is actually the most horrible thin原创 2013-07-15 16:21:00 · 530 阅读 · 0 评论 -
codeforces 296C
题目两颗线段树,一颗用来统计每一次操作的次数,一颗就是寻常的统计求和的线段树。学会了在结构体中构造多颗线段树的方法,因为建统计次数的线段树时,一直以n来建,导致wa了很多次。代码如下:#include#include#include#includeusing namespace std;#define lson l,m,rt<<1#define rson m+1,r,r原创 2013-07-15 23:23:26 · 723 阅读 · 0 评论 -
UESTC 1425
题目和hdu 3308差不多多了pushudown来更新区间内的值代码如下:#include#include#includeusing namespace std;#define maxn 100005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct Tree{ int l,r; int原创 2013-07-16 16:17:26 · 596 阅读 · 0 评论 -
poj 3308
题目由于询问的特殊性,需要把区间合并起来。具体情况可以通过代码来模拟过程画图理解。代码如下:#include#include#includeusing namespace std;#define maxn 100010#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct Tree{ int l,r;原创 2013-07-16 15:37:05 · 545 阅读 · 0 评论 -
poj 3667
题目根据题意来进行区间合并,和其他区间合并的题目差不多。关键是在线段树中要了解维护哪几个量,然后主要的操作在PushUp和PushDown两个函数中完成与其他类型的线段树的最大区别就在query中要有区间合并的过程。代码如下:#include#includeusing namespace std;#define maxn 50005#define lso原创 2013-07-17 16:52:09 · 637 阅读 · 1 评论 -
hdu 3397
题目0和1,分别将区间置0和置1,区间替换。2,区间翻转,只需要注意线段树中的sum、lsum、rsum、msum的值就好3,区间求和,得到几则有几个14,区间合并,注意在查询的时候合并。线段树综合好题,基本上所有的有关的操作都糅合进去了。奇迹般的1Y了!#include#includeusing namespace std;#define maxn 1000原创 2013-07-18 10:45:46 · 592 阅读 · 0 评论 -
poj 2481
题目与stars类似,不过此题找的是左上角的值,这样把e按照从大到小排序,s仍然是从小到大排序。剩下的注意离散化就行了。树状数组数以的是:一定不能从0开始,否则0+lowbit(0)=0,会陷入死循环所以需要++;代码如下:#include#include#include#includeusing namespace std;const int maxn=原创 2013-08-03 15:09:12 · 693 阅读 · 0 评论