博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ACM_数据结构] POJ2352 [树状数组稍微变形]
阅读量:6313 次
发布时间:2019-06-22

本文共 2495 字,大约阅读时间需要 8 分钟。

 

Description

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.

Input

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. 

Output

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.

Sample Input

51 15 17 13 35 5

Sample Output

12110
1 #include
2 #include
3 #include
4 using namespace std; 5 #define maxn 32100//是叶节点能达到的最大值多一点 6 int C[maxn];//从1开始编号 7 //-------------------------- 8 int lowbit(int x){ 9 return x&-x;10 }11 int sum(int x){12 int ret=0;13 while(x>0){14 ret+=C[x];15 x-=lowbit(x);16 }17 return ret;18 }19 void add(int x,int d){20 while(x<=maxn){21 C[x]+=d;22 x+=lowbit(x);23 }24 }25 //--------------------------26 /*27 给定n个点,问这一点左下角的区域的点的个数,不包括这一点28 因为输入是按照y从小到达,然后是按x从小到达,且x不同29 因此先出现的肯定比后出现的y小即在后出现的点之下,30 因此只要把x作为树状数组下标就可以啦。然后用一个out[num]维护31 个数为num的点的数量32 */33 int out[maxn];34 int main(){35 int n;36 while(scanf("%d",&n)!=EOF){37 int x,y;38 int i,j;39 memset(out,0,sizeof(out));40 memset(C,0,sizeof(C));41 for(i=1;i<=n;i++){42 scanf("%d%d",&x,&y);43 out[sum(x+1)]++;44 add(x+1,1);45 }46 for(i=0;i
http://www.cnblogs.com/zjutlitao/p/3701986.html
你可能感兴趣的文章
网址分享
查看>>
一、Android Studio入门——Eclipse快捷键配置
查看>>
mysql如何用order by 自定义排序
查看>>
opencv学习笔记(二)寻找轮廓
查看>>
macos下安装oh-my-zsh和zsh-autosuggestion
查看>>
联合主键用hibernate注解映射方式主要有三种:
查看>>
hdu2767之强联通缩点
查看>>
qualcomm permission denied for tty device
查看>>
IDEA远程debug的使用
查看>>
自然语言处理要解决的问题
查看>>
RVM 安装 Ruby
查看>>
Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十四)定义一个avro schema使用comsumer发送avro字符流,producer接受avro字符流并解析...
查看>>
分布式锁的几种实现方式
查看>>
solr 忽略大小写
查看>>
WEB前端资源代码:面试篇
查看>>
PHP面试题汇总
查看>>
[转]XNA 错误:No suitable graphics card found
查看>>
当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'tb_User' 中的标识列插入显式值。
查看>>
[Web前端]CSS实现“不可选择,不可复制”面临的问题
查看>>
Linux学习笔记四--Bash Shell
查看>>