ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线段树、树状数组入门

2019-08-18 19:50:33  阅读:170  来源: 互联网

标签:return 入门 val 树状 int 线段 tree step include


HDU-1166

思路:更新区间,结构体内保存最大值

 1 #include<stdio.h>
 2 #include<string>
 3 #include<iostream>
 4 using namespace std;
 5 const int MAXN = 5e4+5;
 6 int a[MAXN];
 7 struct node
 8 {
 9     int L,R,sum,la;
10 }tree[MAXN<<2];
11 //建树 
12 void Build(int L,int R,int step)
13 {
14     tree[step].L=L;tree[step].R=R;
15     if(L==R)
16     {
17         tree[step].sum=a[L];return;
18     }
19     int mid=(L+R)>>1;
20     Build(L,mid,step<<1);
21     Build(mid+1,R,step<<1|1);
22     tree[step].sum=tree[step<<1].sum+tree[step<<1|1].sum;
23 }
24 //单点查询
25 int Query(int P,int step)
26 {
27     if(tree[step].L==tree[step].R)return tree[step].sum;
28     int mid=(tree[step].L+tree[step].R)>>1;
29     int ans;
30     if(P<=mid)ans=Query(P,step<<1);
31     else Query(P,step<<1|1);
32     return ans;    
33 } 
34 //单点修改
35 void Add(int P,int val,int step)
36 {
37     if(tree[step].L==tree[step].R)
38     {
39         tree[step].sum+=val;return ;
40     }
41     int mid=(tree[step].L+tree[step].R)>>1;
42     if(P<=mid)Add(P,val,step<<1);
43     else Add(P,val,step<<1|1);
44     tree[step].sum=tree[step<<1].sum+tree[step<<1|1].sum;
45  } 
46 //区间查询
47 int Ask(int L,int R,int step)
48 {
49     if(tree[step].L==L&&tree[step].R==R)return tree[step].sum;
50     int mid=(tree[step].L+tree[step].R)>>1;
51     if(R<=mid)return Ask(L,R,step<<1);
52     if(L>mid)return Ask(L,R,step<<1|1);
53     else return Ask(L,mid,step<<1)+Ask(mid+1,R,step<<1|1);    
54 } 
55 int main()
56 {
57     int T,K=1;
58     scanf("%d",&T);
59     while(T--)
60     {
61         int N;
62         scanf("%d",&N);
63         printf("Case %d:\n",K++);
64         for(int i=1;i<=N;++i)scanf("%d",&a[i]);
65         Build(1,N,1);
66         string s;
67         while(cin>>s)
68         {
69             if(s[0]=='E')break;
70             if(s[0]=='Q')
71             {
72                 int l,r;
73                 scanf("%d%d",&l,&r);
74                 printf("%d\n",Ask(l,r,1));
75             }
76             else
77             {
78                 int P,val;
79                 scanf("%d%d",&P,&val);
80                 if(s[0]=='S')val=-val;
81                 Add(P,val,1);
82             }
83         }
84     }
85     return 0;
86 } 

HDU-1754

思路:线段树模板题,更新单点区间,并且区间内保存最大值

 1 #include<stdio.h>
 2 #include<string>
 3 #include<iostream>
 4 using namespace std;
 5 const int MAXN = 2e5+5;
 6 int a[MAXN];
 7 struct node
 8 {
 9     int L,R,sum,la;
10 }tree[MAXN<<2];
11 int max(int a,int b)
12 {
13     return a>b?a:b;
14 }
15 //建树 
16 void Build(int L,int R,int step)
17 {
18     tree[step].L=L;tree[step].R=R;
19     if(L==R)
20     {
21         tree[step].sum=a[L];return;
22     }
23     int mid=(L+R)>>1;
24     Build(L,mid,step<<1);
25     Build(mid+1,R,step<<1|1);
26     tree[step].sum=max(tree[step<<1].sum,tree[step<<1|1].sum);
27 }
28 //单点修改
29 void Add(int P,int val,int step)
30 {
31     if(tree[step].L==tree[step].R)
32     {
33         tree[step].sum=val;return ;
34     }
35     int mid=(tree[step].L+tree[step].R)>>1;
36     if(P<=mid)Add(P,val,step<<1);
37     else Add(P,val,step<<1|1);
38     tree[step].sum=max(tree[step<<1].sum,tree[step<<1|1].sum);
39  } 
40 //区间查询
41 int Ask(int L,int R,int step)
42 {
43     if(tree[step].L==L&&tree[step].R==R)return tree[step].sum;
44     int mid=(tree[step].L+tree[step].R)>>1;
45     if(R<=mid)return Ask(L,R,step<<1);
46     if(L>mid)return Ask(L,R,step<<1|1);
47     else return max(Ask(L,mid,step<<1),Ask(mid+1,R,step<<1|1));    
48 } 
49 int main()
50 {
51     int N,T;
52     while(~scanf("%d%d",&N,&T))
53     {
54         for(int i=1;i<=N;i++)scanf("%d",&a[i]);
55         Build(1,N,1);
56         while(T--)
57         {
58             string s;
59             cin>>s;
60             int l,r;
61             scanf("%d%d",&l,&r);
62             if(s[0]=='Q')
63             {
64                 printf("%d\n",Ask(l,r,1));
65             }
66             else 
67             {
68                 Add(l,r,1);
69             }
70         }         
71     }
72     return 0;
73 } 

 

标签:return,入门,val,树状,int,线段,tree,step,include
来源: https://www.cnblogs.com/Vagrant-ac/p/11373624.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有