您的位置:首页 > 其它

HDU--杭电--1556--Color the ball--线段树

2013-11-17 01:36 453 查看

Color the ball

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6657    Accepted Submission(s): 3494

[align=left]Problem Description[/align]N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗? 
[align=left]Input[/align]每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
当N = 0,输入结束。 
[align=left]Output[/align]每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。 
[align=left]Sample Input[/align]
3
1 1
2 2
3 3
3
1 1
1 2
1 3

[align=left]Sample Output[/align]
1 1 1
3 2 1



#include <iostream>
#include <cstdio>
using namespace std;
int n,K;
struct node
{
int l,r,x;
}s[555555];
void setit(int l,int r,int step)
{
s[step].l=l;  //先初始化此节点
s[step].r=r;
s[step].x=0;
if(l==r)return;  //如果是最底层就停止向下递归
int mid=(l+r)/2;  //取中点并判断向下递归
setit(l,mid,2*step);
setit(mid+1,r,2*step+1);
}
void insert(int l,int r,int step,int x)
{
if(s[step].l==l&&s[step].r==r){s[step].x+=x;return;}  //找到了就加上来
int mid=(s[step].l+s[step].r)/2;  //不然取中点判断向下递归
if(mid>=l&&mid<r)insert(l,mid,2*step,x),insert(mid+1,r,2*step+1,x);
else insert(l,r,2*step+(mid<l?1:0),x);
}
void print(int l,int r,int step)
{
if(s[step].l==l&&s[step].r==r){printf("%d",s[step].x);return;}  //找到了就输出
s[2*step].x+=s[step].x;  //不然就说明没到最底层,把值往下压
s[2*step+1].x+=s[step].x;
s[step].x=0;  //同时这节点的值为0
int mid=(s[step].l+s[step].r)/2;  //去中点并判断向下递归
if(mid>=l&&mid<r)print(l,mid,2*step),print(mid+1,r,2*step+1);
else print(l,r,2*step+(mid<l?1:0));
}
int main (void)
{
int a,b,i,j,k,l;
while(scanf("%d",&n)!=EOF&&n)
{
setit(1,n,1);K=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
insert(a,b,1,1);
}
for(i=1;i<n;i++)print(i,i,1),putchar(32);
print(i,i,1);putchar(10);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: