日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU1556 Color the ball [线段树模板]

發布時間:2024/10/8 编程问答 33 如意码农
生活随笔 收集整理的這篇文章主要介紹了 HDU1556 Color the ball [线段树模板] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:區間修改序列值,最后輸出。

 //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=;//存原數組數據下標[1,n]
//更新節點信息,這里是求和
void pushup(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
//建樹
void pushdown(int rt,int ln,int rn)
{//ln,rn為左子樹,右子樹的數量
if(add[rt])//下推標記
{
add[rt<<]+=add[rt];
add[rt<<|]+=add[rt];
sum[rt<<]+=add[rt]*ln;
sum[rt<<|]+=add[rt]*rn;
add[rt]=;//清除本節點標記
}
}
void build(int l,int r,int rt)//rt表示當前節點編號
{
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當前節點區間,rt當前節點編號,L需要修改的節點,c修改的值
if(l==r)
{
sum[rt]+=c;
return;
}
int m=(l+r)>>;
//根據條件判斷調用左子樹還是右子樹
if(L<=m)
update(L,c,l,m,rt<<);
else
update(L,c,m+,r,rt<<|);
pushup(rt);//子節點更新,所以本節點也需要更新
} //區間修改a[r,t]+=c
void update_(int L,int R,int c,int l,int r,int rt)
{//L,R表示操作區間,l,r表示當前節點區間,rt表示當前節點編號
if(L<=l&&r<=R)//遍歷的區間在操作區間內
{
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);
} //區間查詢 a[l,r]的和
//下推標記函數
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,);//區間修改 }
for(int i=;i<=n;i++)
{
if(i!=)
printf(" ");
printf("%d",query(i,i,,n,));//因為查詢單點所以是i到i
}
printf("\n");
}
return ;
}

總結

以上是生活随笔為你收集整理的HDU1556 Color the ball [线段树模板]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。