HDU 1556 Color the ball
2016-02-16 13:18
375 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556
题意:有n个数,编号为1到n,每次一个操作 a b,表示区间[a,b]内的数都记一次,最后输出每个数记过几次。
思路:n的范围是10W,平方模拟的算法会超时。我们要优化每次对区间的操作,如果对区间[3,5]操作一次,x[3]++,x[6]--。
那么我们观察前六个数的区间和 0 0 1 1 1 0 ,前缀和的状态正好可以表示我们刚才的操作,而且去更新前缀和可以借助树状数组优化至logn。
树状数组专题链接:/article/8966392.html
题意:有n个数,编号为1到n,每次一个操作 a b,表示区间[a,b]内的数都记一次,最后输出每个数记过几次。
思路:n的范围是10W,平方模拟的算法会超时。我们要优化每次对区间的操作,如果对区间[3,5]操作一次,x[3]++,x[6]--。
那么我们观察前六个数的区间和 0 0 1 1 1 0 ,前缀和的状态正好可以表示我们刚才的操作,而且去更新前缀和可以借助树状数组优化至logn。
树状数组专题链接:/article/8966392.html
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std; #define rep(i,j,k) for(int i = j; i <= k; i++ ) #define Rrep(i,j,k) for(int i = j; i >= k; i-- ) #define Clean(x,y) memset(x,y,sizeof(x)) const int maxn = 100008; int n; int sum[maxn]; int lowbit(int x) { return x&(-x); } int query(int x) { int ans = 0; while( x ) { ans += sum[x]; x-=lowbit(x); } return ans; } void add(int x,int k) { while( x<=n ) { sum[x]+=k; x+=lowbit(x); } } int main() { while(cin>>n) { if ( !n ) break; Clean(sum,0); int a,b; rep(i,1,n) { scanf("%d %d",&a,&b); add(a,1); add(b+1,-1); } rep(i,1,n) printf("%d%c",query(i),(i==n?'\n':' ' )); } return 0; }
相关文章推荐
- Linux 命令学习之df and du
- build docker镜像时发送到deamo的内容过大问题
- delphi中Message消息的使用方法
- Java描述贪心算法解决背包问题
- 无限循环背景ParallaxNode
- Android 图片缓存之内存缓存技术LruCache,软引用
- js 处理数据里面的空格
- 一个现代化的JSON库Moshi针对Android和Java
- top-N 抽样
- poj 2887 Big String
- MongoDB安装配置快速指南
- [LeetCode] Shortest Word Distance III 最短单词距离之三
- ls -bash: ls: command not found
- Spring Data JPA入门
- 使用QT实现右击菜单实例
- 博客,我来了~
- firefox 禁用javascript
- 牙
- yii2 ActiveForm::begin的区分
- 2016/02/16 codes