线段树题型2
来源:互联网 发布:新热血英豪mac打不开 编辑:程序博客网 时间:2024/05/17 01:38
Color the ball
Total Submission(s): 9208 Accepted Submission(s): 4709
当N = 0,输入结束。
31 12 23 331 11 21 30
1 1 13 2 1代码:#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct comp
{
int l,r,mid,x;
}data[400010];
int first;
void bulid(int l,int r,int k)//建树;
{
data[k].l=l;
data[k].r=r;
data[k].mid=(l+r)/2;
data[k].x=0; if(l==r) return ;
bulid(l,data[k].mid,2*k);
bulid(data[k].mid+1,r,2*k+1);
}
void updata(int l,int r,int k)
{ if(data[k].l==l&&data[k].r==r)//如果需要涂色的区间等于该区间,区间内每个气球的涂色次数加1;
{
data[k].x++;
return ;
}
if(r<=data[k].mid)
updata(l,r,2*k);
else if(l>data[k].mid)
updata(l,r,2*k+1);
else {
updata(l,data[k].mid,2*k);
updata(data[k].mid+1,r,2*k+1);
}
}
void search(int k)
{ if(data[k].l==data[k].r)//一个叶子节点,没有下一层了,直接输出
{ if(!first)
printf("%d",data[k].x);//输出的第一个数前面没有空格;
else
printf(" %d",data[k].x);
first=1; return ;
}
data[2*k].x+=data[k].x;//把上一层涂的次数加到下一层上,一直更新到叶子节点
data[2*k+1].x+=data[k].x;
search(2*k);
search(2*k+1);
}
int main()
{ int i,n,a,b; while(scanf("%d",&n),n)
{
bulid(1,n,1); for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
updata(a,b,1);
}
first=0;
search(1);
printf("\n");
} return 0;
}
- 线段树题型2
- 线段树题型汇总
- 线段树题型1
- 线段树题型3
- 线段树题型整理
- 线段树基本题型总结
- 敌兵布阵-线段树以及树形数组经典题型
- hihoCoder 1079 : 离散化(线段树之连续区间+离散化) 经典题型
- 字典树题型分类
- zigbee(题型整理2)
- 【待重置】最小生成树各种题型
- 关于二叉树的常见题型
- 线段树2
- hdu3974 线段树-2
- 线段树(2)
- 线段树练习 2
- 线段树2练习
- 2维线段树
- Hibernate的clear(),flush(),evict()方法详解
- LA 3027 Corporative Network 合作网络【并查集+路径压缩】
- object-c笔记
- CodeForces - 38E Let's Go Rolling!
- Light OJ 1356 Prime Independence 最大独立集+素数筛选
- 线段树题型2
- Spring MVC 框架搭建及详解
- 计算地图上两点之间的距离
- seekg()与tellg()相关文件操作
- POJ2739
- CSDN个人空间能再烂吗?
- live555 env->taskScheduler().doEventLoop()解析/自己实现
- Linux串口测试程序
- 网络流之最小点权覆盖和最大点权独立集学习