poj 2352 Stars(树状数组)
来源:互联网 发布:大数据重塑护理价值 编辑:程序博客网 时间:2024/06/17 17:00
题目链接:http://poj.org/problem?id=2352
思路:树状数组
分析:
1 题目是要求出每一个点的左下(正左+正下)有几个星星,那个这个点就是第几层,最后输出0~n-1层的点的个数。比如样列编号为5的星星,左下有3个星星那么5就处于第三层
2 利用树状数组,我们知道树状数组C中,C[i]表示的是原先数组A中的某一段和。题目明确指出输入的时候是按照y值增大的顺序(y相同是x增大),那么我们应该要用什么做为原先的数组A呢,很显然就是X轴,就是A[2]表示x = 2的点的个数。那么当新加入一个点的x值为2的时候,A[2]++,这个时候就是要更新C[2],C[2+lowbit(2)]...
3 那怎么求某个点的左下有几个星星呢,很显然处在左下的点的x值肯定小于等于当前点的,那么就是相当与树状数组求和,那么整道题的思路就完成
4 注意更新树状数组的时候,注意x<=MAXN,不是输入的n。因为更改了A[x],就要更新C[x] , C[x+lowbit(x)]...
5 题目输入的x的坐标可能为0,所以这边我们把所有的x+1,这就避免了TLE
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN =32010;int n;int ans[MAXN];int treeNum[MAXN];int lowbit(int x){ return x&(-x);}int getSum(int x){ int sum = 0; while(x){//将以x为根节点的数 相当于求其叶节点的和 但其非叶节点等于其两个子节点的和 sum += treeNum[x]; x -= lowbit(x); } return sum;}void add(int x , int val){ while(x < MAXN){//相当于一个树 他将其自己以及他的父节点一路向上都加val treeNum[x] += val; x += lowbit(x); }}int main(){ while(~scanf("%d" , &n)){int x,y;for(int i = 1 ; i <= n ; i++){scanf("%d%d" ,&x,&y);x++;ans[getSum(x)]++;add(x,1);}for(int i = 0 ; i < n ; i++)printf("%d\n" , ans[i]); } return 0;}
阅读全文
0 0
- POJ 2352 Stars(树状数组)
- poj 2352 Stars (树状数组)
- POJ 2352 Stars 树状数组(入门)
- poj - 2352 - Stars(树状数组)
- poj 2352 Stars(树状数组基础)
- POJ - 2352 Stars (树状数组)
- POJ 2352 Stars (树状数组)
- POJ 2352 Stars (树状数组)
- POJ - 2352 - Stars (树状数组!!)
- Stars (poj 2352 树状数组)
- POJ 2352 Stars(树状数组)
- POJ---2352-Stars(树状数组)
- POJ 2352 Stars (树状数组)
- POJ 2352 Stars(树状数组)
- POJ 2352 Stars(树状数组)
- POJ 2352 Stars(树状数组)
- POJ 2352 Stars(树状数组)
- POJ 2352 Stars (树状数组)
- saltstack-安装笔记(1)
- 第六章 常用类总结
- 动态规划之0-1背包问题(简单易懂)
- POJ2135: Farm Tour 题解
- css_day01_简单介绍
- poj 2352 Stars(树状数组)
- This关键字正式学习笔记
- ZStack
- 转载:学习技术三部曲
- HTML-表单标签
- 把Dataset中全为空的列去掉,只留下有数据的列
- 关于java 的static代码块注意以及测试
- 红顶商人 —— 胡雪岩
- STM32 IO口模拟I2C+驱动MPU6050