树状数组模板,RMQ模板

昨天讲的是树状数组和RMQ,今天做了几个题总结了一下模板,至于树状数组的精髓就在这个图当中吧

rmq就是储存2^k的数据递归查询  利用二分和分治的思想:

树状数组:

 1 int c[50005];
 2 int n;
 3 int lowbit(int x)
 4 {
 5     return x&(-x);
 6 }
 7 void add(int i, int val)
 8 {
 9     while(i<=n)
10     {
11         c[i]+=val;
12         i+=lowbit(i);
13     }
14 }
15 void sub(int i, int val)
16 {
17     while(i<=n)
18     {
19         c[i]-=val;
20         i+=lowbit(i);
21     }
22 }
23 int sum(int i)
24 {
25     int s=0;
26     while(i>0)
27     {
28         s+=c[i];
29         i-=lowbit(i);
30     }
31     return s;
32 }
33 //已通过测试

rmq模板:

 1 #include<iostream>
 2 #include<string.h>
 3 #include<stdio.h>
 4 #include<algorithm>
 5 #include<math.h>
 6 using namespace std;
 7 
 8 const int maxn=1005;
 9 int dp[maxn][20];
10 int a[maxn];
11 
12 void init(int n)
13 {
14     memset(dp,0,sizeof(dp));
15     for(int i=1;i<=n;i++)
16     {
17         dp[i][0]=a[i];
18     }
19     int mm=log(1.0*n)/log(2.0);
20     for(int j=1;j<=mm;j++)
21     {
22         for(int i=1;i+(1<<(j-1))<=n;i++)
23         {
24             dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
25         }
26     }
27 }
28 
29 int query(int l,int r)
30 {
31     int mm=log(1.0*(r-l))/log(2.0);
32     return max(dp[l][mm],dp[r-(1<<mm)+1][mm]);
33 }
34 
35 
36 int main()
37 {
38     int n;
39     freopen("aa.txt","r",stdin);
40     while(cin>>n)
41     {
42         for(int i=1;i<=n;i++)
43         {
44             cin>>a[i];
45         }
46         init(n);
47         int q;
48         cin>>q;
49         int x1,y1;
50         while(q--)
51         {
52             cin>>x1>>y1;
53             cout<<query(x1,y1)<<endl;
54         }
55     }
56 }
57 //已通过测试

题目:

树状数组:

HDU 1166  纯模板题

HLG 1161  模板+对于时间的控制(在time时间内恢复)  用一个数组标记即可

//明天把题目再把题目加上

原文地址:https://www.cnblogs.com/zhanzhao/p/3581453.html