您的位置:首页 > 其它

模板:线段树(1)点修改

2016-03-15 19:37 405 查看
有点愚蠢。。。就稍微记录一下吧

//线段树记录区间最小值,minv数组为线段树中节点,A数组记录每个点的值

int ql,qr;//查询[ql,qr]中的最小值
int query(int o,int l,int r){
int m = l + (r-l)/2, ans = INF;
if(ql <= l && r <= qr) return minv[o];//当前节点完全包含在查询区间内
if(ql <= m) ans = min(ans, query(o*2, l, m));//往左走
if(m<qr) ans = min(ans, query(o*2+1, m+1, r));//往右走
return ans;
}

int p,v;//修改:A[p] = v;
void update(int o, int l, int r){
int m = l + (r-l)/2;
if(l == r) minv[o] = v;
else { //l < r
//先递归更新左子数或者右子树
if(p <= m) update(o*2, l, m);
else update(o*2+1, m+1, r);
//然后计算本节点的minv
minv[o] = min(minv[o*2], minv[o*2+1]);
}
}

void creat(int o, int l, int r){ //建树
if(l == r){
minv[o] = A[l];
return;
}
int m = l + (r-l)/2;
creat(o*2, l, m);
creat(o*2+1, m+1, r);
minv[o] = min(minv[o*2], minv[o*2+1]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: