hdu1556Color the ball线段树区间更新
线段树区间更新更新一段区间,在更新区间的过程中,区间被分成几段,每一段的左右界限刚好是一个节点的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线段树区间更新的更多相关文章
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- Color the ball 线段树 区间更新但点查询
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...
- hdu 1556 Color the ball 线段树 区间更新
水一下 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 ...
- HDU_1556_线段树区间更新
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- HDU 1698 线段树 区间更新求和
一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...
随机推荐
- VSCode 运行go test显示打印日志
在VSCode中运行go test,在代码中写的 fmt.Printf("TestB \n") 这些语句均不打印,只显示最终的结果 PASS ok github.com/B .03 ...
- 爬虫的原理获取html中的图片到本地
如果你想获取哪个网页的图片,如果你想知道那个网址的美女,还等什么.代码走起:下载即可使用 完成这次瞎爬的原理如下: 第一步:获取html内容 * 第二步:然后在获取的html文本中寻找图片,根据htm ...
- SQL-SQL基础
SQL(Structured Query Language)是通用的数据库查询语言,各个数据库厂商均对SQL-92标准做了支持,同一时候各家又再次基础上做了相应扩展,比如oracle的PL/SLQ. ...
- 谷歌浏览器console.log()失效,打印不出来内容
这个问题困扰好几天了,网上说的都说的是下图: 勾选这三个就好了,但是我的本来就是勾选上的,还是不行. 后来发现这个: 把这个去掉就可以了,如下图: 原来是因为之前调试js的时候,使用了这个过滤,导致对 ...
- ASP.NET动态网站制作(16)-- SQL数据库(2)
前言:SQL数据库的第二节课,继续讲解基本的语句及用法. 内容: 1.insert插入语句 insert into Book(bookName,bookPrice,bookAuthor) value ...
- web.xml配置整理
虽然是做web开发,但是web中的很多配置有的时候却不是很清楚,只是知道怎么配置,于是就把在网上看到各种关于web.xml的东西整理一下: web.xml中url-pattern的3种写法 1完全匹配 ...
- 洛谷P2296 寻找道路==codevs3731 寻找道路
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- vue-cli (vue脚手架)
vue-cli(脚手架):它可以自动生成目录 1.在网速不佳的情况下可以安装cnpm(淘宝镜像)如果网速快可以不用安装cnpm直接进行下一步操作 第一步:在命令行执行(全局安装cnpm) npm in ...
- android菜鸟学习笔记22----ContentProvider(二)ContentObserver的简单使用
现在有这样一个应用A通过ContentProvider提供自己的数据给其他应用,应用B通过ContentResolver获取应用A中提供的数据,并将其展示在ListView中,而应用C通过Conten ...
- 2.设计模式---Adapter模式
Adapter模式也就是适配器模式,最常见的就是这个:码农必备-------------->笔记本电源适配器: 那么这玩意到底是干嘛的?? 手工画图一张: 220V--------------- ...