昨天讲的是树状数组和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时间内恢复) 用一个数组标记即可
//明天把题目再把题目加上