[HDOJ1556]Color the ball
2015-09-01 17:35
316 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556
树状数组的第二类应用:区间更新。需要做的是将update函数修改为由a更新到n+权值即可,然后更新b到n-权值就可以实现固定区间的更新。
代码如下:
树状数组的第二类应用:区间更新。需要做的是将update函数修改为由a更新到n+权值即可,然后更新b到n-权值就可以实现固定区间的更新。
代码如下:
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> #include <queue> #include <map> #include <stack> #include <list> #include <vector> using namespace std; const int maxn = 100010; int d[maxn<<1]; int n, a, b; //求某点管辖范围 int lowbit(int x) { //求x末尾最低位1的位置(末尾0的个数+1) // return x & (x ^ (x - 1)); return x & (-x); } //更新树状数组(i到x) void update(int i, int x, int num) { while(i <= x) { d[i] += num; i += lowbit(i); } } //获取前x项和 int getsum(int x) { int sum = 0; while(x > 0) { sum += d[x]; x -= lowbit(x); } return sum; } int main() { // freopen("in", "r", stdin); while(~scanf("%d", &n) && n) { memset(d, 0, sizeof(d)); for(int i = 1; i <= n; i++) { scanf("%d %d", &a, &b); update(a, n, 1); update(b+1, n, -1); } for(int i = 1; i <= n; i++) { int ans; if(i == 1) { printf("%d", d[i]); } else { printf("%d", getsum(i)); } if(i != n) { printf(" "); } else { printf("\n"); } } } }
相关文章推荐
- Shell中的${}、##和%%使用范例
- 一个查看贝塞尔曲线效果的网站
- SQL有自带的处理xml的方法
- MySQL学习笔记------Windows下安装MySql 5.5
- java中数组操作的10大方法
- 小笔记
- 47.AFNetworking2.5使用
- 48.iOS8 xcode6/iphone6plus适配--不适配启用的是兼容模式
- 使用ViewUtils遇见空指针异常
- The OSI Model
- jQuery $(document).ready()和window.onload
- 对TimeQuest一些术语的解释
- JVM内幕:Java虚拟机详解
- UE3 Creating A Mesh Proxy
- 45.【IOS网络编程】socket编程 - Asyncsocket
- 46.【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
- android中保存一个ArrayList到SharedPreferences的方法
- 虚拟机创建失败
- Tornado之main文件
- Redis介绍以及安装(Linux)