题目链接

线段树区间更新更新一段区间,在更新区间的过程中,区间被分成几段,每一段的左右界限刚好是一个节点的tree[node].left和tree[node].right(如果不是继续分,直到是为止)

区间几次更新后,进行查询,查询的过程就可以看成重走了更新的过程,所以第一种代码中ans+=A[k].count;

ans就是最后答案

 #include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct tree
{
int x,y,mid;
int count;
}A[]; void creat(int x,int y,int k)
{
A[k].x=x;
A[k].y=y;
int mid=(x+y)/;
A[k].count=;
if(x==y)return ;
creat(x,mid,*k);
creat(mid+,y,*k+);
} void insert(int x,int y,int k)
{
if(A[k].x==x&&A[k].y==y)
{
A[k].count++;return;
}
int mid=(A[k].x+A[k].y)/;
if(x>mid)insert(x,y,*k+);
else if(y<=mid)insert(x,y,*k);
else
{
insert(x,mid,*k);
insert(mid+,y,*k+);
} } int ans;
void search(int t,int k)
{
ans+=A[k].count; if(A[k].x==A[k].y&&A[k].x==t)return ;
int mid=(A[k].x+A[k].y)/;
if(t<=mid)search(t,*k);
else search(t,*k+);
} int main()
{
int n,i;
int a,b;
while(scanf("%d",&n)!=-&&n)
{
creat(,n,);
for(i=;i<n;i++)
{
scanf("%d%d",&a,&b);
insert(a,b,);
}
for(i=;i<n;i++)
{
ans=;
search(i,);
printf("%d ",ans);
}
ans=;
search(i,);
printf("%d\n",ans);
}
return ;
}

在第二种代码中其实思路是一样的,

if ( seg[idx].l == l && seg[idx].l )
{
seg[idx].cnt++;//这个节点被刷了一次,但实际上是要求seg[idx].l到seg[idx].r的区间都刷一次的,l~r就对应了相应的序号的气球
return;
}

for (int i = seg[idx].l; i <= seg[idx].r; i++)
ans[i] += seg[idx].cnt;//所以在这个区间里,相应的气球都刷一次

 #include <stdio.h>
#include <string.h> const int MAXN = ; typedef struct {
int cnt;
int l;
int r;
}Node; Node seg[ * MAXN];
int ans[MAXN]; void build(int idx,int l,int r)
{
seg[idx].l = l;
seg[idx].r = r;
seg[idx].cnt = ; if ( l == r )
return; int mid = ( l + r ) >> ;
build(idx << , l, mid);
build((idx << ) + , mid + , r);
} void color(int idx,int l,int r)
{
if ( seg[idx].l == l && seg[idx].l )
{
seg[idx].cnt++;//这个节点被刷了一次,但实际上是要求seg[idx].l到seg[idx].r的区间都刷一次的,l~r就对应了相应的序号的气球
return;
} int mid = ( seg[idx].l + seg[idx].r ) >> ;
if ( r <= mid )
color(idx << , l, r);
else if ( mid + <= l )
color((idx << ) + , l, r);
else
{
color(idx << , l, mid );
color((idx << ) + , mid + , r);
}
} void solve(int idx)
{
for (int i = seg[idx].l; i <= seg[idx].r; i++)
ans[i] += seg[idx].cnt;//所以在这个区间里,相应的气球都刷一次 if ( seg[idx].l == seg[idx].r )
return; solve(idx << );
solve((idx << ) + );
} int main()
{
// freopen("1.txt","r",stdin); int N;
while ( scanf("%d",&N) == )
{
memset(ans, , sizeof(ans));
memset(seg, , sizeof(seg)); if ( N == )
break; build(,,N);
int p,q; for (int i = ; i < N; i++)
{
scanf("%d%d",&p,&q);
color(,p,q);
} solve(); for ( i = ; i <= N; i++)
printf("%d%c",ans[i], ( i == N ) ? '\n' : ' ' ); } return ;
}

第三种代码则有些不同,上面两种代码在更新的时候只更新到了满足left==seg[n].left&&right==seg[n].right的节点,并未继续更新下去直到节点。

而第三种代码则更新到了节点,所以查询代码也是直接查询节点。

 //不更新所有的节点,如果seg[n].v=0说明这一段是混合的,由他的子节点分开表示

 #include<stdio.h>
#define MAXN 100005
class seg_tree
{
public:
int mid(){return (left+right)/;};
int left,right,v;
}seg[*MAXN];
void build(int n,int left,int right)
{
seg[n].left=left;
seg[n].right=right;
seg[n].v=;
if(seg[n].left==seg[n].right)return ;
build(*n,left,seg[n].mid());
build(*n+,seg[n].mid()+,right);
} void update(int n,int left,int right)
{
if(left==seg[n].left&&right==seg[n].right)
{
seg[n].v++;
return ;
}
if(seg[n].v>)//向下更新
{
seg[*n].v+=seg[n].v;
seg[*n+].v+=seg[n].v;
seg[n].v=;//代表这个节点往下的一次更新结束
}
if(right<=seg[n].mid())update(*n,left,right);
else if(left>seg[n].mid())update(*n+,left,right);
else
{
update(*n,left,seg[n].mid());
update(*n+,seg[n].mid()+,right);
}
}
int query(int n,int index)
{
if(seg[n].left==seg[n].right)
{
return seg[n].v;
}
if(index<=seg[n].mid())return seg[n].v+query(*n,index);
else return seg[n].v+query(*n+,index);
} int main()
{
int n,i,x,y;
//freopen("a.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
build(,,n);
for(i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
update(,x,y);
}
printf("%d",query(,));
for(i=;i<=n;i++)printf(" %d",query(,i));printf("\n");
}
return ;
}

hdu1556Color the ball线段树区间更新的更多相关文章

  1. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  2. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  3. Color the ball 线段树 区间更新但点查询

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...

  4. hdu 1556 Color the ball 线段树 区间更新

    水一下 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 ...

  5. HDU_1556_线段树区间更新

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  7. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  8. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  9. HDU 1698 线段树 区间更新求和

    一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...

随机推荐

  1. ps -ef 和 aux 区别

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  2. 要胀爆的Angular1.0

    尝试从http请求上遏制缓存: http://blog.csdn.net/u010039979/article/details/54376856 if (!$httpProvider.defaults ...

  3. PHP-Manual的学习----【语言参考】----【类型】-----【Boolean类型】

    2017年7月20日15:41:26Boolean 布尔类型 1.这是最简单的类型.boolean 表达了真值,可以为 TRUE 或 FALSE. 其实就是真假的问题.2.语法 要指定一个布尔值,使用 ...

  4. We7的区县站点群建设策略

    一.解决门户和委办局.乡镇的互动 构建以区县政府门户为主站,各委办局.乡镇为子站的站点群体系: 基于统一的信息体系,实现分级授权.统一管理的功能.各网站能够有独立的页面展现和管理后台,同一时候网站之间 ...

  5. winphone 中的指针和手势事件

    注意  有关这些主题的最新概述,请参阅指针事件和手势事件主题. 小心  W3C 指针事件规范自从在 Internet Explorer 10 中实施以来,已经经历了多次修订.此外,截止到 Intern ...

  6. 记录-JQuery日历插件My97DatePicker日期范围限制

    对于日期控件,有时会有不能选择今天以前的日期这种需求..... My97DatePicker是一个非常优秀的日历插件,不仅支持多种调用模式,还支持日期范围限制. 常规的调用比较简单,如下所示: 1 & ...

  7. Java语言实现简单FTP软件------>源码放送(十三)

    Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...

  8. SpringBoot学习笔记(4):与前端交互的日期格式

    SpringBoot学习笔记(4):与前端交互的日期格式 后端模型Date字段解析String 我们从前端传回来表单的数据,当涉及时间.日期等值时,后端的模型需将其转换为对应的Date类型等. 我们可 ...

  9. rails 注释

    view -# js.erb <%# xxxx %> 单行注释

  10. 每天一个Linux命令(36)ps命令

          Linux中的ps命令是Process Status的缩写.       ps命令用于报告当前系统的进程状态.可以搭配kill指令随时中断.删除不必要的程序.       (1)用法:   ...