HDOJ 1541 star(树状数组)
2016-03-13 21:15
459 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1541
这道题告诉我们若干颗星星的坐标,告诉我们的时候y坐标已经按照升序排列了。对于每一颗星,它的等级数等于它左边和左上角星星的颗数。最后问每一颗星星的等级。
把星星按照给我们的顺序(就是y坐标从小到大的顺序),依次把一个数组中下标为x的元素加1。对于某一颗星,坐标为x,那么把数组中下标为x及之前的所有元素相加,就是求了这颗星左边及左上角的星星数,然后再把下标为x的元素加1。(这颗星星本身不能算进去)
这道题告诉我们若干颗星星的坐标,告诉我们的时候y坐标已经按照升序排列了。对于每一颗星,它的等级数等于它左边和左上角星星的颗数。最后问每一颗星星的等级。
把星星按照给我们的顺序(就是y坐标从小到大的顺序),依次把一个数组中下标为x的元素加1。对于某一颗星,坐标为x,那么把数组中下标为x及之前的所有元素相加,就是求了这颗星左边及左上角的星星数,然后再把下标为x的元素加1。(这颗星星本身不能算进去)
#include<cstdio> #include<cstring> #include<cstdio> #include<algorithm> #define N 32005 using namespace std; int n, c , level ; int lowbit(int x) { return x & (-x); } int query(int x) { int sum = 0; while (x > 0) { sum += c[x]; x -= lowbit(x); } return sum; } int add(int i, int d) { while (i <= 32001) { c[i] += d; i += lowbit(i); } } int main() { int ans, x, y; while (~scanf("%d", &n)) { memset(c, 0, sizeof(c)); memset(level, 0, sizeof(level)); for (int i = 1; i <= n; i++) { scanf("%d%d", &x, &y); x++; ans = query(x); level[ans]++; add(x, 1); } for (int i = 0; i < n; i++) printf("%d\n", level[i]); } return 0; }
相关文章推荐
- iOS开发-进阶:iOS7中的多任务 - Background Fetch,Silent Remote Notifications,Background Transfer Service
- 数据结构之邻接表
- 数据库的悲观锁和乐观锁
- C++ / CLI 调用 C++ /Native 随记
- jmeter中基于oracle的JDBC Request的使用
- java多线程的线程池
- 面试题目二
- 软件包管理—rpm
- 操作系统三个简单的部分(Operating Systems in Three Easy Pieces)4.1
- 随便写写C++,看看Essential C++
- 使用Euclidean法求乘法逆
- POJ 1470 Closest Common Ancestors(离线tarjan-LCA)
- java ssh
- HDU 1846 (巴什博弈)
- 记程序第一次增补体会
- 中兴事件之痛 ——谁扒掉了中国电子整机产业的皇帝新衣(转)
- Java编程思想学习(十五) 注解
- 精辟
- 大公司的JAVA面试关于JAVA集合类----阿冬专栏
- 在C语言中,static关键字的作用是什么?