您的位置:首页 > 其它

kb-07线段树-05-区间整体修改查询;(水)

2015-05-30 23:37 330 查看
/*

*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct P
{
int l,r,value;
int add;
}tr[400005];
void Pushup(int rt)
{
tr[rt].value=tr[rt<<1].value+tr[rt<<1|1].value;
}
void build(int rt,int l,int r)
{
tr[rt].l=l;
tr[rt].r=r;
tr[rt].add=0;
if(l==r)
{
tr[rt].value=1;
return ;
}
int mid=(l+r)/2;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
Pushup(rt);
}
/*
区间修改,整体改成一个数,所以只需要记录这个数就可以了,区间的和可以用这个数乘以区间长度来求;
*/
void Pushdown(int rt)
{
if(tr[rt].add<=0)
return ;
tr[rt<<1].value=tr[rt].add*(tr[rt<<1].r-tr[rt<<1].l+1);
tr[rt<<1|1].value=tr[rt].add*(tr[rt<<1|1].r-tr[rt<<1|1].l+1);
tr[rt<<1].add=tr[rt].add;
tr[rt<<1|1].add=tr[rt].add;
tr[rt].add=0;
}
void Update(int rt,int l,int r,int begin,int end,int x)
{
if(begin<=l&&end>=r)
{
tr[rt].add=x;
tr[rt].value=x*(r-l+1);//把区间更新成x
return ;
}
Pushdown(rt);
if(begin <=tr[rt<<1].r)
{
Update(rt<<1,l,tr[rt<<1].r,begin,end,x);
}
if(end >=tr[rt<<1|1].l)
{
Update(rt<<1|1,tr[rt<<1|1].l,r,begin,end,x);
}
Pushup(rt);//区间下面的值发生变化,所以要pushup

}
int main()
{
int T,k=1;
scanf("%d",&T);
while(T--)
{
int n,q;
scanf("%d%d",&n,&q);
memset(tr,0,sizeof(tr));
build(1,1,n);
for(int i=0;i<q;i++)
{
int ll,rr,v;
scanf("%d%d%d",&ll,&rr,&v);
Update(1,1,n,ll,rr,v);
//            for(int j=1;j<=25;j++)
//                printf("%d:%d\n",j,tr[j].value);
}
int ans=tr[1].value;
printf("Case %d: The total value of the hook is %d.\n",k++,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: