博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2352 Stars
阅读量:6585 次
发布时间:2019-06-24

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

Stars
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 27342   Accepted: 11961

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

Hint

This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed.

Source

    一开始老想着用multiset, 想了一会没有想到,突然想到可以用线段树,一次ac
#include 
#include
#include
#include
#define N 33000#define M 16000using namespace std;struct num{ int l,r,sum;}a[4*N];struct inf{ int x,y;}b[M];int level[M],res;int main(){ //freopen("data.in","r",stdin); void pre_build(int k,int l,int r); void find(int k,int l,int r); void update(int k,int l); int n,Max; while(scanf("%d",&n)!=EOF) { Max=0; for(int i=1;i<=n;i++) { scanf("%d %d",&b[i].x,&b[i].y); b[i].x+=1; Max=max(Max,b[i].x); } pre_build(1,1,Max); memset(level,0,sizeof(level)); for(int i=1;i<=n;i++) { int x =b[i].x; int y =b[i].y; res=0; find(1,1,x); level[res]++; update(1,x); } for(int i=0;i<=n-1;i++) { printf("%d\n",level[i]); } } return 0;}void pushup(int k){ a[k].sum=a[k<<1].sum+a[k<<1|1].sum;}void pre_build(int k,int l,int r){ a[k].l = l; a[k].r = r; if(l==r) { a[k].sum=0; return ; } int mid=(l+r)>>1; pre_build(k<<1,l,mid); pre_build(k<<1|1,mid+1,r); pushup(k);}void find(int k,int l,int r){ if(a[k].l==l&&a[k].r==r) { res+=a[k].sum; return ; } int mid=(a[k].l+a[k].r)>>1; if(r<=mid) { find(k<<1,l,r); }else if(l>mid) { find(k<<1|1,l,r); }else { find(k<<1,l,mid); find(k<<1|1,mid+1,r); }}void update(int k,int l){ if(a[k].l==a[k].r) { a[k].sum+=1; return ; } int mid=(a[k].l+a[k].r)>>1; if(l<=mid) { update(k<<1,l); }else { update(k<<1|1,l); } pushup(k);}

转载地址:http://agxno.baihongyu.com/

你可能感兴趣的文章
必 备 习 题 集 (一)
查看>>
转:模态对话框的支持 (IE,Firefox,Chrome)
查看>>
关于图片或者文件在数据库的存储方式归纳
查看>>
Diff Two Arrays
查看>>
[清华集训2014]玛里苟斯
查看>>
Project Euler 345: Matrix Sum
查看>>
你可能不知道的技术细节:存储过程参数传递的影响
查看>>
.htaccess 基础教程(四)Apache RewriteCond 规则参数
查看>>
多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
查看>>
Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
查看>>
React Native 0.20官方入门教程
查看>>
最优化问题中黄金分割法的代码
查看>>
Jquery获取iframe中的元素
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
Struts2简单入门实例
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
SpringBoot实战总汇--详解
查看>>
尝试使用iReport4.7(基于Ubuntu Desktop 12.04 LTS)
查看>>
子元素应该margin-top为何会影响父元素【转】
查看>>
AJAX 状态值(readyState)与状态码(status)详解
查看>>