Problem 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,输入结束。
当N = 0,输入结束。
Output
每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
#include<bits/stdc++.h>
using namespace std;
const int N=400010;
int n,tree[N],laz[N];
void pushdown(int node,int len1,int len2){
if(laz[node]!=0){
tree[node*2]+=len1*laz[node];
tree[node*2+1]+=len2*laz[node];
laz[node*2]+=laz[node];
laz[node*2+1]+=laz[node];
laz[node]=0;
}
}
void pushup(int node){
tree[node]=tree[node*2]+tree[node*2+1];
}
void add(int node,int L,int R,int l,int r){
if(l<=L&&R<=r){
laz[node]++;
tree[node]+=R-L+1;
return;
}
int mid=(L+R)/2;
pushdown(node,mid-L+1,R-mid);
if(mid>=l)add(node*2,L,mid,l,r);
if(mid<r)add(node*2+1,mid+1,R,l,r);
pushup(node);
}
void query(int node,int L,int R){
if(L==R){
printf("%d",tree[node]);
if(L!=n)printf(" ");
return;
}
int mid=(L+R)/2;
pushdown(node,mid-L+1,R-mid);
query(node*2,L,mid);
query(node*2+1,mid+1,R);
pushup(node);
}
int main(){
int i,x,y;
while(scanf("%d",&n)){
if(n==0)return 0;
for(i=1;i<=n;i++){
scanf("%d%d",&x,&y);
add(1,1,n,x,y);
}
query(1,1,n);
printf("\n");
memset(tree,0,sizeof(tree));
memset(laz,0,sizeof(laz));
}
return 0;
}
227

被折叠的 条评论
为什么被折叠?



