poj 2352 Stars (树状数组)
2015-07-08 14:14
134 查看
题目;http://poj.org/problem?id=2352
题意:给定n个点的坐标(x,y),n个点按y坐标从小到大输入,如果y坐标相等的按x坐标从小到大输入。统计每个点的左下方有多少个点(包括左边和下边),输出统计数为0的个数、统计数为1的个数...统计数为n-1的有多少个。
分析:对于任意一个点p(x,y),在p的左下方的点t(x',y')的纵坐标y'肯定≤y,那么问题就转化为,对于所有的点,在之前输入的点里面统计横坐标小于x的点的个数(由于输入有序,纵坐标其实没用)。那么用树状数组就很容易解决了,不过注意x可能等于0,0+lowbit(0)==0,会导致死循环,将所有的点向由平移1个点位就行了。
代码:
题意:给定n个点的坐标(x,y),n个点按y坐标从小到大输入,如果y坐标相等的按x坐标从小到大输入。统计每个点的左下方有多少个点(包括左边和下边),输出统计数为0的个数、统计数为1的个数...统计数为n-1的有多少个。
分析:对于任意一个点p(x,y),在p的左下方的点t(x',y')的纵坐标y'肯定≤y,那么问题就转化为,对于所有的点,在之前输入的点里面统计横坐标小于x的点的个数(由于输入有序,纵坐标其实没用)。那么用树状数组就很容易解决了,不过注意x可能等于0,0+lowbit(0)==0,会导致死循环,将所有的点向由平移1个点位就行了。
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <map> #include <cstring> using namespace std; const int INF = 32005; int tree[INF],ans[INF]; int lowbit(int x) { return x&-x; } void update(int x,int v) { for(int i=x;i<INF;i+=lowbit(i)) tree[i]+=v; } int query(int x) { int ret(0); for(int i=x;i>0;i-=lowbit(i)) ret+=tree[i]; return ret; } int main() { int n,i,j,x,y; while(scanf("%d",&n)!=EOF) { memset(tree,0,sizeof(tree)); memset(ans,0,sizeof(ans)); for(i=0;i<n;i++) { scanf("%d%d",&x,&y); ++ans[query(x+1)]; update(x+1,1); } for(i=0;i<n;i++) printf("%d\n",ans[i]); } return 0; }
相关文章推荐
- opencv3.0 新算法
- android水波纹RippleEffect源码解析
- 二、MongoDB的简单增删改查
- KVC 字典转模型(属性不全导致崩溃的解决方法)
- CentOS Bash漏洞终极修复方法
- c++链表std::list
- 在线扫描PDF JPG 图片上面文字
- html5画饼形图
- XML文件的解析方式
- 不思考就问-闭门造车-不懂感恩
- Centos 安装tomcat7
- BCB Delphi WIN7 默认 以管理员身份运行 程序
- 使用tar 和 split 将文件打包、压缩并分割成指定大小
- 十六进制、字符串互转
- 测试博客园Markdown 表格
- Google V8编程详解(一)V8的编译安装(Ubuntu)
- sizeof求结构体的大小
- 根据IP地址查询主机名
- vmware安装的网络连接禁用后产生的问题以及解决方法
- fullcalendar的简单运用