题目链接

线段树区间更新更新一段区间,在更新区间的过程中,区间被分成几段,每一段的左右界限刚好是一个节点的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. X264学习1:简介

    H.264是视频编码标准. X264是它的开源实现,是视频编码器. 目录 [隐藏]  1 编码器特性 2 输入输出文件类型 2.1 输入 2.2 输出 3 preset和tune系统 3.1 --pr ...

  2. 读取Excel中的数据到DataSet

    读取Excel中的数据到DataSet 1.引用命名空间 using System.Data.OleDb; 2.输入Excel文件,输出DataSet public DataSet ExecleDs( ...

  3. Python标识符

    在python里,标识符有字母.数字.下划线组成. 在python中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. python中的标识符是区分大小写的. 以下划线开头的标识符是有 ...

  4. cmake实战第一篇:初试 cmake

    1.准备工作: 首先,在/code_test 目录下建立一个 cmake 目录,用来放置我们学习过程中的所有练习.(如果以下命令出现xxx: cannot create directory ‘x’:  ...

  5. Convex optimization 凸优化

    zh.wikipedia.org/wiki/凸優化 以下问题都是凸优化问题,或可以通过改变变量而转化为凸优化问题:[5] 最小二乘 线性规划 线性约束的二次规划 半正定规划 Convex functi ...

  6. hibernate 多对多操作(级联操作)

    一.级联保存 分别在用户和角色配置文件中在set标签中加入cascade="save-update": 示例:添加同时添加用户对象和角色对象并关联两个对象: 只需将角色放入用户对象 ...

  7. react create app ,nginx服务器配置

    server{ listen 80; server_name www.domain.com domain.com; location ~* \.js$ { root /home/hard/Projec ...

  8. 在VS2010下打开VS2008项目的解决办法

    如何在vs2010中打开vs2008项目文件? 第一步:以记事本方式打开该项目的sln解决方案,找到这两行信息,分别如下:Microsoft Visual Studio Solution File,  ...

  9. MySQL——视图

    核心知识点: 1.视图定义 2.视图的好处:安全.节约资源.操作简单,数据的同一性 3.视图的基本操作 一.视图概论 视图是一个虚拟表,其内容由查询定义. 同真实的表一样,视图包含一系列带有名称的列和 ...

  10. CAS的实现Atomic类库

    atomic 原子(atomic)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为"不可被中断的一个或一系列操作".在多 ...