HDU1556 Color the ball [线段树模板]
生活随笔
收集整理的這篇文章主要介紹了
HDU1556 Color the ball [线段树模板]
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:區(qū)間修改序列值,最后輸出。
//hdu1166
#include<iostream>
#include<cstdio>
#include<cstring>
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
using namespace std;
const int maxn=;
int sum[maxn<<],add[maxn<<];//sum求和,add懶惰標記
int a[maxn]={},n=;//存原數(shù)組數(shù)據(jù)下標[1,n]
//更新節(jié)點信息,這里是求和
void pushup(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
//建樹
void pushdown(int rt,int ln,int rn)
{//ln,rn為左子樹,右子樹的數(shù)量
if(add[rt])//下推標記
{
add[rt<<]+=add[rt];
add[rt<<|]+=add[rt];
sum[rt<<]+=add[rt]*ln;
sum[rt<<|]+=add[rt]*rn;
add[rt]=;//清除本節(jié)點標記
}
}
void build(int l,int r,int rt)//rt表示當前節(jié)點編號
{
if(l==r)
{
sum[rt]=a[l];
return;
}
int m=(l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
pushup(rt);
} //點修改a[L]+=c;
void update(int L,int c,int l,int r,int rt)
{//l,r當前節(jié)點區(qū)間,rt當前節(jié)點編號,L需要修改的節(jié)點,c修改的值
if(l==r)
{
sum[rt]+=c;
return;
}
int m=(l+r)>>;
//根據(jù)條件判斷調(diào)用左子樹還是右子樹
if(L<=m)
update(L,c,l,m,rt<<);
else
update(L,c,m+,r,rt<<|);
pushup(rt);//子節(jié)點更新,所以本節(jié)點也需要更新
} //區(qū)間修改a[r,t]+=c
void update_(int L,int R,int c,int l,int r,int rt)
{//L,R表示操作區(qū)間,l,r表示當前節(jié)點區(qū)間,rt表示當前節(jié)點編號
if(L<=l&&r<=R)//遍歷的區(qū)間在操作區(qū)間內(nèi)
{
sum[rt]+=c*(r-l+);
add[rt]+=c;
return;
}
int m=(l+r)>>;
pushdown(rt,m-l+,r-m);
if(L<=m)
update_(L,R,c,l,m,rt<<);
if(R>m)
update_(L,R,c,m+,r,rt<<|);
pushup(rt);
} //區(qū)間查詢 a[l,r]的和
//下推標記函數(shù)
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return sum[rt];
}
int m=(l+r)>>;
pushdown(rt,m-l+,r-m);
int ans=;
if(L<=m)
ans+=query(L,R,l,m,rt<<);
if(R>m)
ans+=query(L,R,m+,r,rt<<|);
return ans;
} int main()
{
int n;
while(scanf("%d",&n)&&n)
{
memset(sum,,sizeof(sum));
memset(add,,sizeof(add));
build(,n,);
for(int i=;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
update_(a,b,,,n,);//區(qū)間修改 }
for(int i=;i<=n;i++)
{
if(i!=)
printf(" ");
printf("%d",query(i,i,,n,));//因為查詢單點所以是i到i
}
printf("\n");
}
return ;
}
總結(jié)
以上是生活随笔為你收集整理的HDU1556 Color the ball [线段树模板]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【神经网络架构】Pyramidal Co
- 下一篇: SpringBoot AOP实现接口次数