hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)
Color the ball
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8984 Accepted Submission(s): 4594
当N = 0,输入结束。
Update(a,);
Update(b+,-);
注意更新a的值就相当于更新区间[a,n]的值(n为限界/因为a要更新往后的所有区间的值),那么更新b+1的值就是更新[b+1,n](更新b往后所有区间的值)。
所以将区间[a,n]值+1,再将无关区间[b+1,n]的值-1,最后就是将区间[a,b]的值+1。
下面是第二类树状数组的实现的两种方式:
代码一(向上更新,向下求和):
#include <iostream>
using namespace std; int n; //限界
int c[]; int lowbit(int x)
{
return x&-x;
} void Update(int x,int v) //更新区间[x,n]的值
{
while(x<=n){
c[x]+=v;
x+=lowbit(x);
}
} int Sum(int x) //求x之前的和
{
int sum = ;
while(x>){
sum+=c[x];
x-=lowbit(x);
}
return sum;
} int main()
{
int a,b,i;
while(scanf("%d",&n)!=EOF){
memset(c,,sizeof(c));
if(n==) break;
for(i=;i<n;i++){
scanf("%d%d",&a,&b);
Update(a,); //将区间[a,n]的值+1,再将无关区间[b+1,n]的值-1,即将区间[a,b]的值+1
Update(b+,-);
}
for(i=;i<=n;i++){
printf("%d",Sum(i)); //求单个的点直接求sum
if(i<n)
printf(" ");
}
printf("\n");
}
return ;
}
代码二(向下更新,向上求和):
#include <iostream>
using namespace std; int n; //限界
int c[]; int lowbit(int x)
{
return x&-x;
} void Update(int x,int v) //更新区间[x,n]的值
{
while(x>){
c[x]+=v;
x-=lowbit(x); //改动,+变成了-,向下更新
}
} int Sum(int x) //求x之前的和
{
int sum = ;
while(x<=n){
sum+=c[x];
x+=lowbit(x); //改动,-变成了+,向上求和
}
return sum;
} int main()
{
int a,b,i;
while(scanf("%d",&n)!=EOF){
memset(c,,sizeof(c));
if(n==) break;
for(i=;i<n;i++){
scanf("%d%d",&a,&b);
Update(a-,-); //将区间[1,a-1]的值-1,再将无关区间[1,b]的值+1,即将区间[a,b]的值+1
Update(b,);
}
for(i=;i<=n;i++){
printf("%d",Sum(i)); //求单个的点直接求sum
if(i<n)
printf(" ");
}
printf("\n");
}
return ;
}
Freecode : www.cnblogs.com/yym2013
hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)的更多相关文章
- HDU 1556 Color the ball (一维树状数组,区间更新,单点查询)
中文题,题意就不说了 一开始接触树状数组时,只知道“单点更新,区间求和”的功能,没想到还有“区间更新,单点查询”的作用. 树状数组有两种用途(以一维树状数组举例): 1.单点更新,区间查询(即求和) ...
- POJ 2155 Matrix(二维树状数组+区间更新单点求和)
题意:给你一个n*n的全0矩阵,每次有两个操作: C x1 y1 x2 y2:将(x1,y1)到(x2,y2)的矩阵全部值求反 Q x y:求出(x,y)位置的值 树状数组标准是求单点更新区间求和,但 ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?
开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...
- 【poj2155】Matrix(二维树状数组区间更新+单点查询)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- HDU 1556 Color the ball(线段树:区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...
- HDU 1556 Color the ball (树状数组区间更新)
水题,练习一下树状数组实现区间更新. 对于每个区间,区间左端点+1,右端点的后一位-1,查询每个位置的覆盖次数 #include <cstdio> #include <cstring ...
- HDU 1556 线段树/树状数组/区间更新姿势 三种方法处理
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
随机推荐
- Exception异常
JAVA异常指的是运行期出现的错误. 观察错误的名字和行号最重要. 运用关键字try将可能出错的语句catch出来并添加友好的话 \ 在这句话中的ae代表一个自己命名的对象. 1.要捕获首先需要知道错 ...
- 在django项目外,使用django.db链接数据库(postgres)
要用python链接到数据库,又不想写太多代码.想到了django,就偷懒了下.用django.db直连. django版本:1.6.5 (1.5以后可以用以下代码) #coding=utf-8 __ ...
- ext grid 子表格
Ext.define('app.view.main.biz.customer.receipt.followup.FollowUpActionPanel', { extend: 'Ext.grid.Pa ...
- Linux的IO性能监控工具iostat详解
Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令来查看初步定位问题.其中iostat可以提供更丰富的IO性能状态数据. . 基本使用 $iostat - ...
- JavaScript——特殊点总结
首先,== equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 下面分别说明: 先说 === ...
- POJ 2121
http://poj.org/problem?id=2121 一道字符串的转换的题目. 题意:就是把那个英文数字翻译成中文. 思路:首先打表,然后把每一个单独的单词分离出来,在组合相加相乘. #inc ...
- Python QRCODE
- python之errno
http://www.cnblogs.com/Security-Darren/p/4168392.html errno.EWOULDBLOCK 操作将会阻塞
- centos7 systemctl 启动 Redis 失败
转自:http://sloger.info/posts/systemd-failed-to-start-redis-in-gentoo 今天启动 Redis 时阻塞很长时间,之后显示启动失败,启动状态 ...
- We7 CMS研究
我下载的we7 3.0是基于vs 2010的,官方网站也建议使用vs2010,但是我有追新的习惯,并相信vs 2013一定能够兼容vs2010的项目,于是在vs2013下打开解决方案并且全部升级,把目 ...