线段树之区间更新Color the ball

Description

N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
 

Input

每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
当N = 0,输入结束。
 

Output

每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
 

Sample Input

3 1 1 2 2 3 3 3 1 1 1 2 1 3 0
 

Sample Output

1 1 1 3 2 1
 
 
 注意:
1.此处要求给出气球被涂色几遍,所以pushup为求和,pushup可以写出,也可以直接嵌进调用的函数中
2.pushdown 也是求和,但是f中存放的是其子结点区间上的总数
 
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=1e5+5;
int f[N<<2];
int lazy[N<<1];
int n;

void build(int root,int left,int right){
lazy[root]=0;
if(left==right){
f[root]=0;
return;
}

int rt,mid;
rt=root<<1;
mid=(left+right)>>1;

build(rt,left,mid);
build(rt+1,mid+1,right);

f[root] = f[rt]+f[rt+1];
}



void pushdown(int root,int left,int right){
int rt,mid;
rt=root<<1;
mid=(left+right)>>1;

lazy[rt]+=lazy[root];
lazy[rt+1]+=lazy[root];

f[rt]+=lazy[root]*(mid-left+1);
f[rt+1]+=lazy[root]*(right-mid);

lazy[root]=0;

}

 

void update(int root,int left,int right,int uleft,int uright,int val){
if(uleft<=left&&uright>=right){
lazy[root]+=val;
f[root]+=val*(right-left+1);
return;
}

pushdown(root,left,right);

int mid=(left+right)>>1;
int rt=root<<1;

if(uleft<=mid){
update(rt,left,mid,uleft,uright,val);
}

if(uright > mid){
update(rt+1,mid+1,right,uleft,uright,val);
}

f[root]=f[rt]+f[rt+1];

}


int query(int root,int left,int right,int qleft,int qright){
if(qleft<=left&&qright>=right){
return f[root];
}
if(lazy[root]!=0){
pushdown(root,left,right);
}

int mid=(left+right)>>1;
int ans=0;
int rt=root<<1;

if(qleft<=mid){
ans+=query(rt,left,mid,qleft,qright);
}
if(qright>mid){
ans+=query(rt+1,mid+1,right,qleft,qright);
}

return ans;
}

int main(){
int x,y;
while(cin>>n&&n!= 0) {
build(1,1,n);
for(int i=1;i<=n;i++){
cin>>x>>y;
update(1,1,n,x,y,1);
}
cout<<query(1,1,n, 1,1);
for(int i=2;i<=n;i++)
cout<<" "<<query(1, 1,n,i,i);
cout<<endl;
}
return 0;
}

 

posted @ 2022-07-13 16:31  killjoyskr  阅读(18)  评论(0)    收藏  举报