您的位置:首页 > 其它

hdu Just a Hook 线段树——成段操作 区域覆盖

2012-08-12 15:11 344 查看
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

大意:先输入一个t代表有t个案例,然后输入个数n代表一共有n个数,值为他们的编号1~n。然后输入q,代表q各更新,再输入a,b,c,代表把a_b的值全部改为c;然后求出所有的和。

View Code

#include <stdio.h>
#define maxn 100007*4
struct node
{
int sum;
int lazy;
}tr[maxn];
void pushup(int rt)
{
tr[rt].sum = tr[rt<<1].sum+tr[rt<<1|1].sum;
}
void build(int l,int r,int rt)
{
if(l == r)
{
tr[rt].sum = 1;
tr[rt].lazy = 0;
return;
}
int m = (l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
pushup(rt);
return;
}
void pushdown(int rt,int len)
{
if(tr[rt].lazy)
{
tr[rt<<1].lazy = tr[rt<<1|1].lazy = tr[rt].lazy;
tr[rt<<1].sum = (len-(len>>1))*tr[rt].lazy;
tr[rt<<1|1].sum = (len>>1)*tr[rt].lazy;
tr[rt].lazy = 0;
}
}
void update(int lx,int rx,int l,int r,int val,int rt)
{
if(lx <= l && rx >= r)//只要在要求的区域内就改变。
{
tr[rt].sum = val*(r-l+1);
tr[rt].lazy = val;
return;
}
pushdown(rt,r-l+1);
int m = (l+r)>>1;
if(lx <= m)
update(lx,rx,l,m,val,rt<<1);
if(rx > m)
update(lx,rx,m+1,r,val,rt<<1|1);
pushup(rt);
return;
}
int main()
{
int cas,t,n,m,i,j;
scanf("%d",&t);
cas = 0;
while(t--)
{
cas++;
scanf("%d",&n);
build(1,n,1);
scanf("%d",&m);
int x,y,val;
while(m--)
{
scanf("%d %d %d",&x,&y,&val);
update(x,y,1,n,val,1);
}
printf("Case %d: The total value of the hook is %d.\n",cas,tr[1].sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: