hihocoder1077,线段树单点修改的一点小技巧
来源:互联网 发布:淘宝级别的等级划分 编辑:程序博客网 时间:2024/06/05 20:56
如果有神犇会区间修改的非递归版本,求教啊
线段树单点修改,区间查询最小值
可以看见我这代码里面全是for循环
zkw 大法好
正常线段树是一颗近似的满二叉树,因为n不是2的k次方
就这样凑成了一个满二叉树
M可以理解为非叶子节点的数量,
那么点i,i+n就是其在堆式储存的线段树数组里的index
一步找到,然后直接up,,单点修改结束
区间查找的话,先变成开区间,然后还是向上更新
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int N=3000100;struct linetree{ #define lc (t<<1) #define rc (t<<1^1) int mi[N],M; inline void build(int n){ M=1; while(M<n)M<<=1; M--; memset(mi,INF,sizeof(mi)); for (int i=1+M;i<=n+M;i++) scanf("%d", &mi[i]); for (int t=M;t>=1;t--)mi[t]=min(mi[lc],mi[rc]); } void change(int t,int x){ for (mi[t+=M]=x,t>>=1;t;t>>=1) mi[t]=min(mi[lc],mi[rc]); } int query(int l,int r){ int ans = INF; for (l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){ if (~l&1)ans=min(ans,mi[l^1]); if ( r&1)ans=min(ans,mi[r^1]); } return ans; }}T;int main(){ int n,q,ord,x,y; for (;~scanf("%d",&n);){ T.build(n); for (scanf("%d",&q);q--;){ scanf("%d%d%d",&ord,&x,&y); if (ord)T.change(x,y); else printf("%d\n",T.query(x,y)); } } return 0;}
最后关于区间操作
0 0
- hihocoder1077,线段树单点修改的一点小技巧
- 线段树-单点更新-hihoCoder1077
- hihocoder1077 线段树
- 线段树(单点修改)
- hihocoder1077 RMQ问题再临-线段树
- 敌兵布阵 简单的线段树单点修改 + 单点查询
- 【模板】线段树单点修改
- 线段树 单点修改,区间修改
- [模板练习]线段树的单点修改和区间查询
- #bzoj3186#单点修改的RMQ问题(zkw线段树版)
- 建立树的一点小技巧
- Minimum Inversion Number 线段树+单点修改
- HDU 2886 线段树单点修改
- [CodeVS1080] 线段树练习(单点修改+求和)
- hdu 1166 线段树(sum+单点修改)
- hdu 1754 线段树(Max+单点修改)
- 【数据结构】【线段树】单点修改区间查询
- 线段树(单点修改,区间查询)
- LintCode_248 Count of Smaller Number
- LintCode_249 Count of Smaller Number before itself
- cjsjk
- hive学习练习&Sqoop知识补充
- Java Apache HttpClient post 获取提交参数并获取网页
- hihocoder1077,线段树单点修改的一点小技巧
- Codeforces 598A Tricky Sum【计数】
- CF 678B 暑假集训13(闰年判断)
- Cortex-M KEIL特殊用法
- [FZU 2105 Digits Count] 线段树区间的复合操作
- Python: 遍历字典
- 个人主页
- Python: 函数式编程
- Merge k Sorted Lists