今天听斌哥讲课,果然V5,讲的是竞赛用堆,从基本到扩展,自顶向下和自底向上,递归与非递归……基本是听懂了,刷了两题,把顶和底都敲了一遍,都A了。本来打算把课后练习刷完的,无奈还不习惯高强度训练,做了两题以后感觉脑力枯竭了,怎么也做不下去了,唉。

hdu 1754

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int MAXD = 200005;
 4 int tree[4*MAXD];
 5 int D;
 6 int max(int a,int b)
 7 {
 8     return a>b ?a :b;
 9 }
10 void update(int n)
11 {
12     for(; n^1; n>>=1)
13         tree[n>>1] = max(tree[n],tree[n^1]);
14 }
15 void query(int cur,int s,int t,int x,int y,int &ans)
16 {
17     int mid = (s+t)>>1;
18     if(s>=x && t<=y)
19     {
20         ans = max(tree[cur],ans);
21         return ;
22     }
23     if(x <= mid) query(cur<<1,s,mid,x,y,ans);
24     if(y >= mid+1) query(cur<<1|1,mid+1,t,x,y,ans);
25 }
26 int main()
27 {
28     int m,n,i,ans,x,y;
29     char t;
30     while(~scanf("%d%d",&n,&m)){
31     memset(tree,0,sizeof(tree));
32     for(D = 1; D < n+2; D <<= 1);
33     for(i = 1; i <= n; i++)
34         scanf("%d",&tree[D+i]);
35     for(i = D-1; i; i--)
36         tree[i] = max(tree[i<<1],tree[i<<1^1]);
37     while(m--)
38     {
39         getchar();
40         scanf("%c%d%d",&t,&x,&y);
41         if(t=='Q')
42         {
43             ans = 0;
44             query(1,0,D-1,x,y,ans);
45             printf("%d\n",ans);
46         }
47         else
48         {
49             tree[D+x] = y;
50             update(D+x);
51         }
52     }
53     }
54     return 0;
55 }