这是一道线段树的裸题……带单点修改的RMQ

  为什么我会想到写这么一道傻逼题呢?是因为这样……【HDOJ】【1754】I Hate It

  我很好奇那个突然冒出来的黄色箭头是什么……所以就去切了一下这道水题……

  

  毫无压力地快速敲完……突然萌生了一种想法:试试自底向上线段树!

  重新看了下zkw大牛的《统计的力量》,发现确实好写,而且灰常好用!

 

写的时候出现的问题:读入应该是读到[n+1,n+n]这一段,而我读到了[n+i-1,n+n-1]……(也就是说:1~n格是树中节点,后n个格是叶子节点)

 1 int t[N<<2],a[N];
 2 #define L (o<<1)
 3 #define R (o<<1|1)
 4 #define mid (l+r>>1)
 5 void maintain(int o,int l,int r){
 6     if (l<r) t[o]=max(t[L],t[R]);
 7 }
 8 void build(int o,int l,int r){
 9     if (l==r) t[o]=a[l];
10     else{
11         build(L,l,mid);
12         build(R,mid+1,r);
13         maintain(o,l,r);
14     }
15 }
16 void update(int o,int l,int r,int pos,int v){
17     if (l==r) t[o]=v;
18     else{
19         if (pos<=mid) update(L,l,mid,pos,v);
20         else update(R,mid+1,r,pos,v);
21         maintain(o,l,r);
22     }
23 }
24 int ql,qr,ans;
25 void query(int o,int l,int r){
26     if (ql<=l && qr>=r)    ans=max(ans,t[o]);
27     else{
28         if (ql<=mid) query(L,l,mid);
29         if (qr>mid) query(R,mid+1,r);
30     }
31 }
普通线段树

相关文章: