Color the ball

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 29526    Accepted Submission(s): 14356

Problem Description
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a
b(a <=
b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
 
Input
每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
当N = 0,输入结束。
 
Output
每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
 
Sample Input
3
1 1
2 2
3 3
3
1 1
1 2
1 3
0
 
Sample Output
1 1 1
3 2 1
 
//注意laz[]要和线段树数组开一样大小
#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
const int n = ;
using namespace std;
void pushdown(int num);
int tre[n * ];
int laz[n*];
void update(int num, int le, int ri, int x, int y,int z)
{
if (x <= le && y >= ri)
{
tre[num] = tre[num] + z;//初值为0,z=1
laz[num] = laz[num] + z;
return;
}
pushdown(num);
int mid = (le + ri) / ;
if (x <= mid)
update(num * , le, mid, x, y, z);
if (y > mid)
update(num * + , mid + , ri, x, y, z);
}
void pushdown(int num)
{
if (laz[num] != )
{
tre[num * ] += laz[num];
tre[num * + ] += laz[num];
laz[num * ] += laz[num];
laz[num * + ] += laz[num];
laz[num] = ;
}
}
int query(int num, int le, int ri, int x)
{
if (le == ri)
{
return tre[num];
}
pushdown(num);
int mid = (le + ri) / ;
if (x <= mid)
return query(num * , le, mid, x);
else
return query(num * + , mid + , ri, x);
}
int main()
{
int t;
while (cin >> t)
{
memset(tre, , sizeof(tre));
memset(laz, , sizeof(laz));//初始化延迟标记
for (int i = ; i < t; i++)
{
int x, y;
cin >> x >> y;
update(, , t, x, y, );
cout << query(, , n, x) << endl;
}
}
return ;
}

用结构体储存数据

#include <stdio.h>
#include<iostream>
#include <string.h>
using namespace std;
struct node
{
int left, right, count;
}c[ * ];
int sum[];
void build(int le, int ri, int root)
{
c[root].left = le;
c[root].right = ri;
c[root].count = ;
if (le == ri)
return;
int mid = (le + ri) / ;
build(le, mid, root * );
build(mid + , ri, root * + );
}
void update(int le, int ri, int root)//更新
{
if (c[root].left == le && c[root].right == ri)//只需要在这个区间+1就行了,节省时间,不用找到每个数
{
c[root].count++;
return;
}
int mid = (c[root].left + c[root].right) / ;
if (mid<le)//如果更新区间在右子树上,就只更新右区间
update(le, ri, root * + );
else if (mid >= ri)//更新左子树
update(le, ri, root * );
else//更新区间即在右子树上,又在左子树上
{
update(le, mid, root * );
update(mid + , ri, root * + );
}
}
void tosum(int root)//求和、记录每个气球被涂过的次数
{
for (int i = c[root].left; i <= c[root].right; i++)
sum[i] += c[root].count;
if (c[root].left == c[root].right)
return;
tosum(root * );//通过子节点来更新父节点
tosum(root * + );
}
int main()
{
int n;
while (scanf("%d", &n) && n)
{
memset(sum, , sizeof(sum));
memset(&c, , sizeof(&c));
build(, n, );
for (int i = ; i<n; i++)
{
int le, ri;
scanf("%d %d", &le, &ri);
update(le, ri, );
}
tosum();
printf("%d", sum[]);
for (int i = ; i <= n; i++)
printf(" %d", sum[i]);
printf("\n");
}
return ;
}

hdu 1556 涂气球 线段树(区间更新~对区间[x,y]更新,求任意节点被更新的次数)的更多相关文章

  1. Color the ball HDU - 1556 (非线段树做法)

    题意:在1到n的气球中,在不同的区域中涂颜色,问每个气球涂几次. #include<cstdio>int num[100010];int main(){ int n, x, y;; whi ...

  2. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  3. bzoj 4631: 踩气球 线段树合并

    4631: 踩气球 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 265  Solved: 136[Submit][Status][Discuss] ...

  4. hdu 5692(dfs序+线段树,好题)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  5. bzoj 4631: 踩气球 线段树

    题目: Description 六一儿童节到了, SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏:有N个盒子从左到右排成一排,第i个盒子里装着Ai个气球. SHUXK 要进行Q次操作,每次从某一个盒子 ...

  6. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  7. 【bzoj4631】踩气球 线段树

    题解: 真是很zz 我都想到线段树分治的思路了... 不过还是一道好题 首先跟线段树分治一样将区间投射到线段树上去 每次修改如果该个区间修改为0,则对他们对应的特定区间-1 这样每个区间会有一次变0, ...

  8. kb-07线段树-12--二分查找区间边界

    /* hdu4614 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边界就好办了: 这 ...

  9. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

随机推荐

  1. 推荐两款富文本编辑器:NicEdit和Kindeditor

    做过Web开发的朋友相信都使用过富文本编辑器,比较出名的CuteEditor和CKEditor很多人应该已经使用过,在功能强大的同时需要加载的东西也变得很多.下面要推荐的两款富文本编辑器都是使用JS编 ...

  2. ROS Learning-011 beginner_Tutorials (编程) 编写 ROS 话题版的 Hello World 程序(Python版)

    ROS Indigo beginner_Tutorials-10 编写 ROS 话题版的 Hello World 程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 ...

  3. JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-007Inheritance of embeddable classes(@MappedSuperclass、@Embeddable、@AttributeOverrides、、)

    一.结构 二.代码 1. package org.jpwh.model.inheritance.embeddable; import javax.persistence.MappedSuperclas ...

  4. Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式

    一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...

  5. vue 之 介绍及简单使用

    浏览目录 vue的介绍 vue的使用 vue的介绍 简介 vue官网说:Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底 ...

  6. kaggle House_Price_XGBoost

    kaggle House_Price_final 代码 import numpy as np import pandas as pd from sklearn.ensemble import Rand ...

  7. python(一):作用域

    与c相比,python作用域很奇特. 在Python中变量的作用域是由它在源代码中的位置决定的,这一点与c相似. python只支持4种作用域,即局部作用域,全局作用域,内置作用域,嵌套作用域. 比较 ...

  8. inline 内联函数

    1.目的: 引入内联函数的目的是为了解决程序中函数调用的效率问题. 函数的引入可以减少程序的目标代码,实现程序代码和数据的共享.但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转 ...

  9. gRPC官方文档(通讯协议)

    文章来自gRPC 官方文档中文版 HTTP2 协议上的 gRPC 本文档作为 gRPC 在 HTTP2 草案17框架上的实现的详细描述,假设你已经熟悉 HTTP2 的规范.产品规则采用的是ABNF 语 ...

  10. Python从小看到大

    最近迷恋上了python,因为一个朋友说python这种脚本语言很厉害,可以做网络攻防的时候用,但是由于自己太笨了,不得不从基础教程学起. 行左右.你可能会问为什么这么少的代码量,这门语言没有火起来, ...