HDU 1556 Color the ball 树状数组 题解
可是N次以后lele已经忘记了第I个气球已经涂过几次颜色了。你能帮他算出每一个气球被涂过几次颜色吗?
当N = 0。输入结束。
3
1 1
2 2
3 3
3
1 1
1 2
1 3
0
1 1 1
3 2 1
这是一条逆向向下更新才比較方便处理数据的题目。
每一个根节点并不是记录和。而是记录改下标下面的节点更新了一次。
所以更新的时候须要注意,小于区间的节点要-1操作。
就这点技巧。
#include <cstdio>
#include <algorithm>
using namespace std; int tree[100005]; inline int lowbit(int x)
{
return x & (-x);
} void update(int x, int val, int len)
{
while (x > 0)
{
tree[x] += val;
x -= lowbit(x);//最高点记录了一个区间内涂了多少次
}
} int query(int x, int len)
{
int ans = 0;
while (x <= len)
{
ans += tree[x];
x += lowbit(x);//全部根节点相加才等于答案
}
return ans;
} int main()
{
int n, a, b;
while (scanf("%d", &n) && n != 0)
{
fill(tree, tree+n+1, 0);
for(int i = 0; i < n; i++)
{
scanf("%d%d",&a,&b);
update(b,1, n);
update(a-1,-1, n); }
for(int i=1;i<n;i++)
{
printf("%d ",query(i, n));
}
printf("%d\n",query(n, n));
}
return 0;
}
事实上也能够正向填表,和一般的查询和操作几乎相同,只是注意怎样更新节点。
的确困难,非常考脑力的。要非常用力地想,呵呵。
#include <cstdio>
#include <algorithm>
using namespace std; const int SIZE = 100005;
int tree[SIZE]; inline int lowbit(int x)
{
return x & (-x);
} void update(int x, int val, int len)
{
while (x <= len)
{
tree[x] += val;
x += lowbit(x);
}
} int query(int x)
{
int ans = 0;
while (x > 0)
{
ans += tree[x];
x -= lowbit(x);
}
return ans;
} int main()
{
int n, a, b;
while (scanf("%d", &n) && n != 0)
{
fill(tree, tree+n+1, 0);
for(int i = 0; i < n; i++)
{
scanf("%d%d",&a,&b);
update(a,1, n);
update(b+1,-1, n); }
for(int i=1;i<n;i++)
{
printf("%d ",query(i));
}
printf("%d\n",query(n));
}
return 0;
}
还有以下这位朋友的博客的直接使用数组解决这个问题,使得时间效率达到O(n)了,非常巧妙,高手!
http://blog.csdn.net/u011560507/article/details/9673529
仿他的写了个,呵呵。
#include <algorithm>
#include<cstdio>
using namespace std;
const int SIZE = 100002;
int arr[SIZE];
int main()
{
int N;
while(scanf("%d",&N) && N)
{
fill(arr, arr+N+1, 0); for(int i = 1; i <= N; i++)
{
int a, b;
scanf("%d %d",&a, &b);
arr[a]++;
arr[b+1]--;
}
for(int i = 1; i < N; i++)
{
arr[i] += arr[i-1];
printf("%d ", arr[i]);
}
printf("%d\n", arr[N] + arr[N-1]);
}
return 0;
}
HDU 1556 Color the ball 树状数组 题解的更多相关文章
- HDOJ/HDU 1556 Color the ball(树状数组)
Problem Description N个气球排成一排,从左到右依次编号为1,2,3-.N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从 ...
- HDU 1556 Color the ball (树状数组区间更新)
水题,练习一下树状数组实现区间更新. 对于每个区间,区间左端点+1,右端点的后一位-1,查询每个位置的覆盖次数 #include <cstdio> #include <cstring ...
- Color the ball(树状数组+线段树+二分)
Color the ball Time Limit : 9000/3000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Tota ...
- HDU 1556 Color the ball【差分数组裸题/模板】
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一 ...
- hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- hdu 5517 Triple(二维树状数组)
Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
随机推荐
- jenkins job构建后汇总结果到同一个文本文档中去
jenkins 构建后,执行下shell脚本,把结果汇总到同一个文件中,这样多个job构建后的结果可以在一个文件中展示 result_all_dir="/app/jenkins_result ...
- python 异步编程
Python 3.5 协程究竟是个啥 Yushneng · Mar 10th, 2016 原文链接 : How the heck does async/await work in Python 3.5 ...
- 分享一:关于mysql中避免重复插入记录方法
一: INSERT ON DUPLICATE KEY UPDATE 如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重 ...
- Redis(二十一):Redis性能问题排查解决手册(转)
性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数 ...
- 豌豆荚不能连接三星S4手机,提示打开手机的“USB调试模式”,但却找不到在哪儿可以设置
1. 问题 豌豆荚不能连接三星S4手机,下载了三星S4手机的驱动后,提示打开手机的“USB调试模式”,但却找不到在哪儿可以设置. 2. 原因 S4 默认隐藏开发者选项,所以默认不可以设置“USB调试模 ...
- 创建Hive/hbase相关联的表异常
hive> CREATE TABLE hperson(id string, name string,email string) STORED BY 'org.apache.hadoop.hive ...
- NGUI下拉菜单学习UIPopupList
NGUI下拉栏主要注意2点 1.弹出文字收回去,需要更新主显文字信息,要绑定调用 2.有时候发现弹出来的面板差别很大 看了下代码 会根据父节点取相对位置. 这样位置就可以了,很奇怪的做法..
- 【Android】6.3 ProgressDialog
分类:C#.Android.VS2015: 创建日期:2016-02-08 一.简介 进度条对话框(ProgressDialog)常用于不能在短时间内快速完成的操作,显示进度条的目的是为了让用户明白程 ...
- Ubuntu 安装谷歌拼音输入法
Ubuntu14.04内置的拼音输入法有一个bug,使得Live USB全拼无法使用. 安装Google拼音输入法步骤如下: 1. 打开Ubuntu软件中心 (Ubuntu Software Cent ...
- C#怎么做系统托盘
建个WinForm项目,其它操作略过.拉个NotifyIcon控件,将属性Visable设置成False没有Icon图标 还要加 Icon图用Form的SizeChanged事件,代码如下:窗口最小 ...