您的位置:首页 > 其它

hdu 1556 Color the ball (线段树,延迟更新)

2012-08-26 10:02 295 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1556

(1)延迟更新:pushdown()函数,记得在所有的查询、更新函数中都要使用到。这里用到懒惰标记mark[]数组。

(2)很基础的题,1A。

具体代码:

View Code

#include<stdio.h>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn=101000;
int n;
int mark[maxn<<2], sum[maxn<<2];
void pushdown(int rt, int n)
{
if(mark[rt])
{
mark[rt<<1]+=mark[rt];
mark[rt<<1|1]+=mark[rt];
sum[rt<<1]+=mark[rt]*(n-n/2);
sum[rt<<1|1]+=mark[rt]*(n/2);
mark[rt]=0;
}
}
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l, int r, int rt)
{
mark[rt]=0;
sum[rt]=0;
if(l==r) return ;
int m=l+r>>1;
build(lson);
build(rson);
}
void update(int L, int R, int l, int r, int rt)
{
if(L<=l&&r<=R)
{
mark[rt]++;
sum[rt]+=r-l+1;
return ;
}
pushdown(rt, r-l+1);
int m=l+r>>1;
if(L<=m) update(L, R, lson);
if(R>m) update(L, R, rson);
pushup(rt);
}
void search(int l, int r, int rt)
{
if(l==r)
{
if(l!=1) printf(" %d", sum[rt]);
else printf("%d", sum[rt]);
return ;
}
pushdown(rt, r-l+1);
int m=l+r>>1;
search(lson);
search(rson);
}
int main()
{
while(scanf("%d", &n)!=EOF, n)
{
build(1, n, 1);
for(int i=1;i<=n;i++)
{
int a, b;
scanf("%d%d", &a, &b);
if(a>b) {int x=a;a=b;b=x;}
update(a, b, 1, n, 1);
}
search(1, n, 1);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: