线段树专题(持续更新中...)

单点更新:最最基础的线段树,只更新叶子节点,然后把信息用PushUP(int r)这个函数更新上来

 1 #include <iostream>
 2 #include<cstring>
 3 #include<stdio.h>
 4 using namespace std;
 5 #define M 50005
 6 int sum[M<<2];
 7 void pushup(int rt)
 8 {
 9     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
10 }
11 void build(int l,int r,int rt)
12 {
13     if(l==r)
14     {
15         scanf("%d",&sum[rt]);
16         return ;
17     }
18     int m=(l+r)/2;
19     build(l,m,rt*2);
20     build(m+1,r,rt*2+1);
21     pushup(rt);
22 }
23 void update(int p,int add,int l,int r,int rt)
24 {
25     if(l==r)
26     {
27         sum[rt]+=add;
28         return ;
29     }
30     int m=(l+r)/2;
31     if(p<=m)
32     {
33         update(p,add,l,m,rt*2);
34     }
35     else
36         update(p,add,m+1,r,rt*2+1);
37     pushup(rt);
38 }
39 int query(int L,int R,int l,int r,int rt)
40 {
41     if(l>=L&&r<=R)
42     {
43         return sum[rt];
44     }
45     int m=(l+r)/2;
46     int ans=0;
47     if(L<=m)
48         ans+=query(L,R,l,m,rt*2);
49     if(R>m)
50         ans+=query(L,R,m+1,r,rt*2+1);
51     return ans;
52 }
53 int main()
54 {
55     int T,n,a,b;
56     scanf("%d",&T);
57     for(int i=1;i<=T;i++)
58     {
59         printf("Case %d:\n",i);
60         scanf("%d",&n);
61         build(1,n,1);
62         char op[10];
63         while(scanf("%s",op)&&op[0]!=‘E‘)
64         {
65             scanf("%d %d",&a,&b);
66             if(op[0]==‘Q‘)
67             {
68                 printf("%d\n",query(a,b,1,n,1));
69             }
70             else if(op[0]==‘A‘)
71             {
72                 update(a,b,1,n,1);
73             }
74             else
75                 update(a,-b,1,n,1);
76         }
77     }
78     return 0;
79 }

hdu1754 I Hate It
线段树功能:update:单点替换 query:区间最值

 1 #include <iostream>
 2 #include<cstring>
 3 #include<stdio.h>
 4 using namespace std;
 5 #define M 222222
 6 int sum[M<<2];
 7 int max(int a,int b)
 8 {
 9     return a>b?a:b;
10 }
11 void pushup(int rt)
12 {
13     sum[rt] =max(sum[rt<<1] ,sum[rt<<1|1]);
14 }
15 void build(int l,int r,int rt)
16 {
17     if(l==r)
18     {
19         scanf("%d",&sum[rt]);
20         return ;
21     }
22     int m=(l+r)/2;
23     build(l,m,rt*2);
24     build(m+1,r,rt*2+1);
25     pushup(rt);
26 }
27 void update(int p,int add,int l,int r,int rt)
28 {
29     if(l==r)
30     {
31         sum[rt]=add;
32         return ;
33     }
34     int m=(l+r)/2;
35     if(p<=m)
36     {
37         update(p,add,l,m,rt*2);
38     }
39     else
40         update(p,add,m+1,r,rt*2+1);
41     pushup(rt);
42 }
43 int query(int L,int R,int l,int r,int rt)
44 {
45     if(l>=L&&r<=R)
46     {
47         return sum[rt];
48     }
49     int m=(l+r)/2;
50     int ans=0;
51     if(L<=m)
52         ans=max(ans,query(L,R,l,m,rt*2));
53     if(R>m)
54         ans=max(ans,query(L,R,m+1,r,rt*2+1));
55     return ans;
56 }
57 int main()
58 {
59     int n,m,a,b;
60     while(scanf("%d%d",&n,&m)!=EOF)
61     {
62         build(1,n,1);
63         char op[2];
64         for(int i=0; i<m; i++)
65         {
66             scanf("%s",op);
67             scanf("%d%d",&a,&b);
68             if(op[0]==‘Q‘)
69                 printf("%d\n",query(a,b,1,n,1));
70             else
71                 update(a,b,1,n,1);
72         }
73     }
74     return 0;
75 }

时间: 2024-10-07 15:55:55

线段树专题(持续更新中...)的相关文章

线段树专题(不定期更新)

1.hdu 1166 敌兵布阵(★☆☆☆☆) 题意:有n个营地,每个营地初始各有若干人,每次询问[l,r]营地的总人数,或者对某个营地加上或减去若干人数. 思路:线段树单点更新,区间查询 1 //线段树单点更新,区间查询 2 #include<iostream> 3 using namespace std; 4 const int maxn = 50010; 5 int N; 6 int barracks[maxn]; 7 int Tree[4 * maxn]; 8 void Create(i

Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题是线段树成段更新,但是不能直接更新,不然只能一个数一个数更新.这样只能把每个数存到一个数组中,长度大概是20吧,然后模拟二进制的位操作.仔细一点就行了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath>

Light OJ 1411 Rip Van Winkle`s Code 线段树成段更新

题目来源:Light OJ 1411 Rip Van Winkle`s Code 题意:3中操作 1种查询 求区间和 其中每次可以把一段区间从左到右加上1,2,3,...或者从右到左加上...3,2,1 或者把某个区间的数都置为v 思路:我是加了6个域 add是这段区间每个数都要加上add  add是这么来的 对与123456...这个等差数列 可能要分为2个区间 那么我就分成123和123 两个右边的等差数列每个数还应该加上3 所以右区间add加3 v是这个区间都要置为v 他的优先级最高 b是

CodeForces 52C Circular RMQ(区间循环线段树,区间更新,区间求和)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://codeforces.com/problemset/problem/52/C You are given circular array a0,?a1,?...,?an?-?1. There are two types of operations with it: inc(lf,?rg,?v) - this operation increases each element on the segm

FZU Problem 2171 防守阵地 II (线段树,区间更新)

 Problem 2171 防守阵地 II Accept: 143    Submit: 565Time Limit: 3000 mSec    Memory Limit : 32768 KB  Problem Description 部队中总共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务,获得的参考指数即为M个士兵的能力之和.随着时间的推移,指挥部将下达Q个指令来替换M个进行防守的士兵们,每个参加完防守

HDU 1698 Just a Hook (线段树 成段更新 lazy-tag思想)

题目链接 题意: n个挂钩,q次询问,每个挂钩可能的值为1 2 3,  初始值为1,每次询问 把从x到Y区间内的值改变为z.求最后的总的值. 分析:用val记录这一个区间的值,val == -1表示这个区间值不统一,而且已经向下更新了, val != -1表示这个区间值统一, 更新某个区间的时候只需要把这个区间分为几个区间更新就行了, 也就是只更新到需要更新的区间,不用向下更新每一个一直到底了,在更新的过程中如果遇到之前没有向下更新的, 就需要向下更新了,因为这个区间的值已经不统一了. 其实这就

hdu 1556:Color the ball(线段树,区间更新,经典题)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7941    Accepted Submission(s): 4070 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电

hdu 1698:Just a Hook(线段树,区间更新)

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15129    Accepted Submission(s): 7506 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing f

【POJ】3468 A Simple Problem with Integers ——线段树 成段更新 懒惰标记

A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each

hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)

敌兵布阵                                                                             Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵