hdoj 1541 Stars【线段树单点更新+最大值维护】
2015-09-11 15:09
501 查看
Stars
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6581 Accepted Submission(s):
2625
[align=left]Problem Description[/align]
Astronomers often examine star maps where stars are
represented by points on a plane and each star has Cartesian coordinates. Let
the level of a star be an amount of the stars that are not higher and not to the
right of the given star. Astronomers want to know the distribution of the levels
of the stars.
For example,
look at the map shown on the figure above. Level of the star number 5 is equal
to 3 (it's formed by three stars with a numbers 1, 2 and 4). And the levels of
the stars numbered by 2 and 4 are 1. At this map there are only one star of the
level 0, two stars of the level 1, one star of the level 2, and one star of the
level 3.
You are to write a program that will count the amounts of the
stars of each level on a given map.
[align=left]Input[/align]
The first line of the input file contains a number of
stars N (1<=N<=15000). The following N lines describe coordinates of stars
(two integers X and Y per line separated by a space, 0<=X,Y<=32000). There
can be only one star at one point of the plane. Stars are listed in ascending
order of Y coordinate. Stars with equal Y coordinates are listed in ascending
order of X coordinate.
[align=left]Output[/align]
The output should contain N lines, one number per line.
The first line contains amount of stars of the level 0, the second does amount
of stars of the level 1 and so on, the last line contains amount of stars of the
level N-1.
[align=left]Sample Input[/align]
5
1 1
5 1
7 1
3 3
5 5
[align=left]Sample Output[/align]
1
2
1
1
0
题意:一个星星的地图,每个星星都有对应的等级,星星等级的计算符合以下规律:一颗星星的 左下方(包括正左方和正下方)的星星个数就是这个星星的等级
题解:先对星星的纵坐标从小到大排列,如果纵坐标相同将横坐标从小到大排列,在进行数据输入时进行对此操作的处理,
#include<stdio.h> #include<string.h> #include<algorithm> #define MAX 32010 using namespace std; int sum[MAX<<2]; int pos[MAX];//记录各等级星星的个数 void pushup(int o) { sum[o]=sum[o<<1]+sum[o<<1|1]; } void gettree(int o,int l,int r) { sum[o]=0; if(l==r) return ; int mid=(l+r)>>1; gettree(o<<1,l,mid); gettree(o<<1|1,mid+1,r); pushup(o); } void update(int o,int l,int r,int L) { if(l==r) { sum[o]+=1; return ; } int mid=(l+r)>>1; if(L<=mid)//因为建树的过程是按照星星的纵坐标从小到大建立的所以此处 //只需要考虑横坐标的情况,当横坐标小于mid对左子树进行操作 //否则对右子树进行操作。 update(o<<1,l,mid,L); else update(o<<1|1,mid+1,r,L); pushup(o); } int find(int o,int l,int r,int L,int R) { if(L<=l&&R>=r) return sum[o]; int ans=0; int mid=(l+r)>>1; if(L<=mid) ans+=find(o<<1,l,mid,L,R); if(R>mid) ans+=find(o<<1|1,mid+1,r,L,R); return ans; } int main() { int n,m,j,i; int x,y; int level; while(scanf("%d",&n)!=EOF) { memset(pos,0,sizeof(pos)); gettree(1,1,MAX); for(i=0;i<n;i++) { scanf("%d%d",&x,&y); level=find(1,1,MAX,1,x+1); pos[level]++; update(1,1,MAX,x+1); } for(i=0;i<n;i++) printf("%d\n",pos[i]); } return 0; }
相关文章推荐
- opendaylight 源码编译
- python图像处理环境配置(linux+windows)
- 把windows目录挂载mount到linux下,非root用户没有写权限解决方法
- 网站favicon.ico配置
- Linux学习之五——压缩与备份
- linux 监控软件
- virtualbox centos安装增强工具
- Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
- nginx反向代理,动静态分离,缓存
- 网站设置404错误页的经历
- 一个文件操作的简单程序:关于文件的fopen、fread、fseek、ftell、fclose等操作(FIFO related)
- Linux CentOS PXE+Kickstart
- nfs+keepalive+inotify+unison实现共享服务池的高可用
- Hadoop 新 MapReduce 框架 Yarn 详解
- Docker 的应用场景在哪里?
- Linux apache+php+mysql
- 阿里云centos+ngnix+mysql配置相关事项
- openssl安装和使用总结
- linux下vim对于意外退出的文档的再次开启
- 十大基于Docker的开发工具