您的位置:首页 > 其它

线段树模板

2014-01-21 13:19 267 查看
upload: inc a value in [left..right]

insert: change value in [left..right]

count: count sum in [left..right]#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
struct tree
{
private:
int a,b,lazy;
long long sum;
bool flag;
tree *l,*r;
void push_down()
{
if(flag)
{
l->sum=r->sum=l->lazy=r->lazy=0;
l->flag=r->flag=1;
}
l->lazy+=lazy;
r->lazy+=lazy;
l->sum+=lazy*(l->b-l->a+1);
r->sum+=lazy*(r->b-r->a+1);
lazy=flag=0;
}
public:
void build(int left,int right)
{
a=left;
b=right;
sum=lazy=flag=0;
if(a<b)
{
int m=(a+b)/2;
l=new tree;
r=new tree;
l->build(a,m);
r->build(m+1,b);
}
else
l=r=NULL;
}
void upload(int left,int right,int value)
{
if(left<=a&&b<=right)
{
lazy+=value;
sum+=value*(b-a+1);
}
else
{
if(lazy||flag)
push_down();
int m=(a+b)/2;
if(left<=m)
l->upload(left,right,value);
if(m<right)
r->upload(left,right,value);
sum=l->sum+r->sum;
}
}
void insert(int left,int right,int value)
{
if(left<=a&&b<=right)
{
lazy=value;
sum=value*(b-a+1);
flag=1;
}
else
{
if(lazy||flag)
push_down();
int m=(a+b)/2;
if(left<=m)
l->insert(left,right,value);
if(m<right)
r->insert(left,right,value);
sum=l->sum+r->sum;
}
}
long long count(int left,int right)
{
if(left<=a&&b<=right)
return sum;
else
{
if(lazy||flag)
push_down();
int m=(a+b)/2;
long long ans=0;
if(left<=m)
ans+=l->count(left,right);
if(m<right)
ans+=r->count(left,right);
return ans;
}
}
};
int main()
{
//put your code here
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: