题目链接

线段树区间更新更新一段区间,在更新区间的过程中,区间被分成几段,每一段的左右界限刚好是一个节点的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. 06 nginx Location详解之精准匹配

    一:Location详解之精准匹配 location 语法 location 有”定位”的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分, ...

  2. unity 切换场景

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...

  3. PHP-Manual的学习----【语言参考】----【类型】-----【string字符串型】

    1.一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节.这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode .2. string 最大可以达到 2GB. ...

  4. Java水印图片处理

    今天需要用Java程序给图片加水印,于是在网上找到了一段代码,感觉很好,于是记录了下来,原来的网址给忘了: import java.awt.AlphaComposite; import java.aw ...

  5. TFS 中工作项的定制-修改工作流

    我们都会用到TFS中的工作项.一般来说,最主要的会用到任务.bug这些工作流来进行项目管理里.但我们发现,实际上,有些模板中的工作流并不能完全符合我们的需要,因此我们会进行工作流的定制操作.下面就会通 ...

  6. zookeeper(二): Curator vs zkClient

    目录 zookeeper Curator zkClient 客户端对比 写在前面 1.1. zookeeper应用开发 1.1.1. ZkClient简介 1.1.2. Curator简介 写在最后 ...

  7. 【python】-- Redis简介、命令、示例

    Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化 ...

  8. Java 迭代器

    1.快速报错 public class FailFast { public static void main(String[] args) { List<String> c = new A ...

  9. 9.Django里的数据同步migrations命令

    一个关键的目录: 目录名:migrations 作用:用来存放通过makemigrations命令生成的数据库脚本,这里的内容一般不要手动去改 规定:app目录下必须要有migrations目录且目录 ...

  10. MySQL 及 SQL 注入与防范方法

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的, ...