kb-07专题--线段树-01-单点修改,区间查和

给定区间长度,然后给两个操作,单点增加值和单点减值,询问一个区间的人数和;(水)

代码如下:

  1 /*
  2   写的第一个线段树,丑;
  3  */
  4 #include<iostream>
  5 #include<cstdio>
  6 #include<cstring>
  7 #include<algorithm>
  8 using namespace std;
  9 typedef struct
 10 {
 11     int l,r;
 12     int value;
 13 }tr[100005];//长度是区间长度的四倍;
 14 int n,a[50005]={0},ans=0;
 15 void build(int i,int l,int r)//建树
 16 {
 17     tr[i].l=l;
 18     tr[i].r=r;
 19     if(l==r)
 20     {
 21         tr[i].value=a[l];
 22         return ;
 23     }
 24     build(i*2,l,(l+r)/2);
 25     build(i*2+1,(l+r)/2+1,r);
 26     tr[i].value=tr[i*2].value+tr[i*2+1].value;
 27 }
 28 void ADD(int i,int l,int x)//区间加值
 29 {
 30     if(tr[i].l==l&&tr[i].r==l)
 31     {
 32         tr[i].value+=x;
 33         return ;
 34     }
 35     int t=i<<1;
 36     if(l<=tr[t].r)
 37            ADD(t,l,x);
 38     t+=1;
 39     if(l>=tr[t].l)
 40         ADD(t,l,x);
 41     tr[i].value=tr[i<<1].value+tr[(i<<1)+1].value;
 42 }
 43 void SUB(int i,int l,int x)//区间减值
 44 {
 45     if(tr[i].l==l&&tr[i].r==l)
 46     {
 47         tr[i].value-=x;
 48         return ;
 49     }
 50     int t=i<<1;
 51     if(l<=tr[t].r)
 52         SUB(t,l,x);
 53     t+=1;
 54     if(l>=tr[t].l)
 55         SUB(t,l,x);
 56     tr[i].value=tr[i<<1].value+tr[(i<<1)+1].value;
 57 }
 58 void QUERY(int i,int l,int r)//区间查询寻;
 59 {
 60     if(tr[i].l==l&&tr[i].r==r)
 61     {
 62         ans+=tr[i].value;
 63         return ;
 64     }
 65     i=i<<1;
 66     if(l<=tr[i].r)
 67     {
 68         if(r<=tr[i].r)
 69             QUERY(i,l,r);
 70         else
 71             QUERY(i,l,tr[i].r);
 72     }
 73     i+=1;
 74     if(r>=tr[i].l)
 75     {
 76         if(l>=tr[i].l)
 77             QUERY(i,l,r);
 78         else
 79             QUERY(i,tr[i].l,r);
 80     }
 81 }
 82 int main()
 83 {
 84     int T,t=1;
 85     cin>>T;
 86     while(T--)
 87     {
 88         memset(a,0,sizeof(a));
 89         ans=0;
 90         cin>>n;
 91         for(int i=1;i<=n;i++)
 92         {
 93             scanf("%d",&a[i]);
 94         }
 95         printf("Case %d:\n",t++);
 96         build(1,1,n);
 97         char s[10];
 98         int x1,x2;
 99         scanf("%s",s);
100         int k=0;
101         while(s[0]!=‘E‘)
102         {
103             scanf("%d%d",&x1,&x2);
104             if(s[0]==‘A‘)
105                 ADD(1,x1,x2);
106             else if(s[0]==‘S‘)
107                 SUB(1,x1,x2);
108             else if(s[0]==‘Q‘)
109             {
110                 QUERY(1,x1,x2);
111                 printf("%d\n",ans);
112                 ans=0;
113             }
114             scanf("%s",s);
115         }
116     }
117     return 0;
118 }
时间: 2024-10-17 22:17:16

kb-07专题--线段树-01-单点修改,区间查和的相关文章

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个工兵

线段树(单点修改,区间求和,区间最大)

(一)线段树 1.E - Lost Cows N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they visited the neighborhood 'watering hole' and drank a few too many beers before dinner. When it was time to line up

线段树 建树 单点修改 点点/区间查询

线段树(sgement tree)是一种分治思想的二叉树结构,用于在区间上进行信息统计.与按照二进制位进行区间划分的树状数组相比,线段树是一种更加通用的结构: 线段树的每个节点都代表一个区间. 线段树具有唯一的根节点,代表的区间是整个统计范围,如[1,n]. 线段树的每个叶节点都代表一个长度为1的元区间,如[x,x] 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度

模板 - 数据结构 - 线段树(单点修改)

这里是以区间最大值为例,要修改成其他的运算,注意修改每个函数的运算以及query中返回的无关值. 这里的区间最大值设置的最小元素为-1(在query中表示与当前区间不相交的区间的结果). 注意因为调用的方式传入l与r是(1,n),所以这个线段树(包括a)其实是从1开始计数的. 最后,小心爆MAXM. const int MAXM=200000; int a[MAXM+5],st[(MAXM<<2)+5]; void build(int o,int l,int r){ if(l==r) st[o

【线段树(单点修改,区间求和)】HDU1166 - 敌军布阵

hdu1166 敌兵布阵,单点修改,区间求和. [ATTENTION]MAXN要开成节点数的4倍,开得不够会提示TLE. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define lson l,m,root<<1 5 #define rson m+1,r,root<<1|1 6 using namespace std; 7 const int MAXN=50000*

poj3171 Cleaning Shifts【线段树(单点修改区间查询)】【DP】

Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4422   Accepted: 1482 Description Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now require their barn to be immaculate. Farmer

hdu 1166 线段树(单点增减 区间求和)

Sample Input1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Sample OutputCase 1:63359 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath>

hdu 1754 I Hate It(线段树之 单点更新+区间最值)

I Hate It                                                                             Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 非常多学校流行一种比較的习惯.老师们非常喜欢询问.从某某到某某其中,分数最高的是多少. 这让非常多学生非常反感. 无论你

kb-07专题线段树-02--单点修改,区间最值

1 /* 2 区间单点该值,区间查询最大值: 3 hdu-1754 4 */ 5 #include<iostream> 6 #include<cstdio> 7 #include<cstring> 8 using namespace std; 9 typedef struct 10 { 11 int l,r; 12 int value; 13 }V; 14 int n,m,a[200005]={0},MAX=-1; 15 V tr[800005]={0}; 16 voi