首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

线段树_小结

2013-10-15 
线段树_总结1.单点更新,(单点查询,区间查询)----------------------------------------------------------

线段树_总结


1.单点更新,(单点查询,区间查询)

--------------------------------------------------------------


hdu1166 敌兵布阵  

一个长度为N的数组,给出了值~

四种操作:

(1)”Add i j",表示第i个营地增加j人

(2)“Sub i j”,表示第i个营地减少j人

(3)“Query i j",查询第i个营地到第j个营地的总人数

(4)”End“,表示命令结束。 

  // 减法就是加法  区间成段的改变  

void PushUp(int rt){    sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void Pushdown(int rt,int len){    if(col[rt]){        col[rt<<1] = col[rt<<1|1] = col[rt];        col[rt] = 0;        sum[rt<<1] = val[rt] * (len - (len>>1));        sum[rt<<1|1] = val[rt] * (len>>1);        val[rt<<1] = val[rt<<1|1] = val[rt];    }}void build(int l,int r,int rt){    val[rt] = 0;    col[rt] = 0;    if(l == r){        sum[rt] = 1;        return ;    }    int m = (l + r)/2;    build(lson);    build(rson);    PushUp(rt);}int query(int L,int R,int l,int r,int rt){    if(L <= l && r <= R){        return sum[rt];    }    Pushdown(rt , r - l + 1);    int m = (l + r)/2;    int ret=0;    if(L <= m) ret += query(L, R, lson);    if(m <  R) ret += query(L, R, rson);    return ret;}

---------------------------------------------------------------------

hdu 4578 Transformation  

n个数(初始化都为0),m个操作

操作1: 区间 [ x , y ] 内都加上c

操作2: 区间 [ x , y ] 内都乘上c

操作3: 区间 [ x , y ] 内都改成c 

操作4: 区间 [ x , y ] 内p次方求和 (1 <= p <= 3)

区间更新的时候,分为三种,在区间PushUp的时候,保证两个儿子节点的值都更新,就把信息传递上去,

解题报告


---------------------------------------------------------------------


hdu 4614 Vases and Flowers

给定一个区间[0,N-1](初始化都为0),

有两种操作,

1.在位置A开始寻找F(如果没有这么多,则有多少个就找多少个)个数值为0的位置,把位置上的数修改为1,并返回第一个和最后一个修改的位置

2.查询区间[A,B]内1的个数,并把区间[A,B]每个位置上的数修改为0。

解题报告


---------------------------------------------------------------------


hdu 4325 Flowers

给出n朵花的在[s,t] 时间里开花,进行m次询问,每次给出时间t,问在这个时间开几朵花。

解题报告


---------------------------------------------------------------------


hdu 4107 Gangster

长度为N的数组,进行m次操作,每次对于给定的区间,若这个区间的数比p大.则+c,否则+2*c;

解题报告


----------------------------------------------------------------------


poj 3468 A Simple Problem with Integers

N个数,M个操作

有两种类型的操作

(1)“C  a b c”,表示将区间[a,b]里的数加上c

(2)“Q a b”,表示查询区间[a,b]的数的和

解题报告


----------------------------------------------------------------------


poj 2528 Mayor's posters

贴海报~经典问题

解题报告


----------------------------------------------------------------------



3.区间合并

---------------------------------------------------------------------


hdu 3308 LCIS

长度为N的数组,进行m次操作,

分为两种操作:

操作1:U A B 把位置A上的更新为B,

操作2: Q A B 输出[A,B]上的最长连续上升子序列


解题报告


---------------------------------------------------------------------


poj 3368 Frequent values

一个长度为n的数组,进行m次询问,

每次询问给出一个区间,求出这个区间中的数出现的最多的次数

解题报告


---------------------------------------------------------------------


SPOJ GSS1 Can you answer these queries I

有一个长度为n的数组,进行m次操作,

每次给出一个区间,求给出该区间的最大子段和

解题报告


---------------------------------------------------------------------


SPOJ GSS3 Can you answer these queries III

解题报告


---------------------------------------------------------------------


SPOJ GSS5 Can you answer these queries V

给定一组数,同时给出[ x1 , y1 ],[ x2 , y2]两个区间,

从一区间找出 i, 从二区间找出 j ,使得a[ i ] + a[i + 1] + a[i + 2] ........+ a[ j ] 得到最大

解题报告


---------------------------------------------------------------------


4.扫描线

---------------------------------------------------------------------


poj 1151

解题报告


---------------------------------------------------------------------


5.其他

---------------------------------------------------------------------


hdu 4417

在长度为n的数组,进行m次询问,

每次给出一个区间[ L , R ],同时给出H,求出这个区间中不大于H的数的个数

解题报告


---------------------------------------------------------------------


hdu 4027  and SPOJ GSS4 Can you answer these queries IV

解题报告


---------------------------------------------------------------------




热点排行