您的位置:首页 > 其它

线段树模板

2013-09-11 20:42 225 查看
线段树 模板

构建,查询,更新

struct Line {
int left;
int right;
int cnt; //延迟标记
}a[MAX];

int n,m,l,r; //n长度,m线段数
int sum;

//函数中的num是节点编号

//构建
void Build(int l, int r, int num) {
a[num].left = l;
a[num].right = r;
a[num].cnt = 0;
if(l==r)
return ;
int mid = (a[num].left + a[num].right)/2;
Build(l, mid, num*2);
Build(mid+1, r, num*2+1);
}

//查询
void Query(int l, int r, int num) {
if(a[num].cnt!=0) {
sum += a[num].cnt*(r-l+1);
}
if(a[num].left == a[num].right)
return ;
int mid = (a[num].left + a[num].right)/2;
if(r<=mid)
Query(l, r, num*2);
else if(l>mid)
Query(l, r, num*2+1);
else {
Query(l, mid, num*2);
Query(mid+1, r, num*2+1);
}
}

//更新
void Change(int l, int r, int num) {
if(l==a[num].left && r==a[num].right) {
a[num].cnt++;
return ;
}
if(a[num].left == a[num].right)
return ;
int mid = (a[num].left + a[num].right)/2;
if(r<=mid)
Change(l, r, num*2);
else if(l>mid)
Change(l, r, mun*2+1);
else {
Change(l, mid, num*2);
Change(mid+1, r, num*2+1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: