题目链接:

http://poj.org/problem?id=2352

题目大意:
对于每一颗星星来说,都有一个属于自己的level,这个值为其他星星x,y坐标均不大于本星星的个数。输入时按先y由小到大,再x由小到大排列,无相同位置的星星

仔细一想其实这道题目根本不需要用到y,我是反向来思考的,构建一个保存x坐标由0到maxn的线段树,因为最后一个星星肯定不可能x,y同时不大于其他星星,所

以从后面开始看,只计算比它x小或相等的星星的个数,用cnt[ans]++,来记录成为ans水平的个数,再删去这个点,继续找上一个点对应的level

在这里要注意的是数组的范围,我就因为这个改了半天错,第一次发现数组范围定的不够大也是WA

他这里星星个数为15000,但是我们保存的是x的坐标,所以要看x最大达32000,所以用4*32000的大小保存tree[],我的代码里懒得修改了就写成了

#define N 15005
int cnt[N],num[2*N],tree[*N],D,maxn;//开始我写成的是4*N所以报错T T

 #include <cstdio>
#include <cstring>
using namespace std;
#define N 15005
int cnt[N],num[*N],tree[*N],D,maxn; int max(int a,int b)
{
return a>b?a:b;
} void update(int i)
{
for(;i^;i>>=)
tree[i>>]=tree[i]+tree[i^];
} int query(int a,int b)
{
int i=D+a-,j=D+b+,ans=;
for(;i^j^;i>>=,j>>=)
{
if(~i&) ans+=tree[i^];
if(j&) ans+=tree[j^];
}
return ans;
} int main()
{
int n,x[N],y;
while(scanf("%d",&n)!=EOF){
maxn=;
memset(num,,sizeof(num));
//memset(tree,0,sizeof(tree));
for(int i=;i<=n;i++){
scanf("%d%d",&x[i],&y);
maxn=max(maxn,x[i]);
num[x[i]]++;
}
for(D=;D<maxn++;D<<=);
for(int i=;i<=maxn+;i++) tree[D+i]=num[i-];
for(int i=D-;i>=;i--) tree[i]=tree[i<<]+tree[i<<|];
for(int i=;i<=n-;i++) cnt[i]=;
//for(int i=1;i<=2*D-1;i++) printf("%d\n",tree[i]);
for(int i=n;i>=;i--){
// printf("%d",query(1,x[i]+1));
tree[D+x[i]+]--;
update(D+x[i]+);
cnt[query(,x[i]+)]++;
}
for(int i=;i<n;i++) printf("%d\n",cnt[i]);
}
return ;
}

当然从前往后思考也是一样的,那样的话是不断将x添入线段树,这里有一份是学长的代码,果然比我反向思考的要简洁好多,而且从他的代码也得到了其实tree的底层在没有

得到顶点的必要时,也是可以不必强求定位1<<n这种2的几次方的大小的,而在这里正好适用,因为每次找个数和只求到i^j^1即可(这个代表左右子树);

代码如下:

#include <cstdio>
#include <cstring>
const int maxn = ;
int tree[maxn<<],a[maxn];
int N,D; void update(int i){
for(;i^;i >>= ){
tree[i>>] = tree[i]+tree[i^];
}
} int query(int x,int y){
int i = D+x-,j = D+y+,ans = ;
for(;i^j^;i >>= ,j >>= ){
if(~i&) ans += tree[i^];
if(j&) ans += tree[j^];
}
return ans;
} int main(){
while(scanf("%d",&N) != EOF){
memset(tree,,sizeof(tree));
memset(a,,sizeof(a));
D = ;
for(int i = ;i < N;i++){
int x,y;
scanf("%d%d",&x,&y);
a[query(,++x)]++;
tree[D+x]++;
update(D+x);
}
for(int i = ;i < N;i++) printf("%d\n",a[i]);
}
return ;
}

POJ 2352 star level的更多相关文章

  1. POJ 2352 Stars(线段树)

    题目地址:id=2352">POJ 2352 今天的周赛被虐了. . TAT..线段树太渣了..得好好补补了(尽管是从昨天才開始学的..不能算补...) 这题还是非常easy的..维护 ...

  2. poj 2352 Stars 数星星 详解

    题目: poj 2352 Stars 数星星 题意:已知n个星星的坐标.每个星星都有一个等级,数值等于坐标系内纵坐标和横坐标皆不大于它的星星的个数.星星的坐标按照纵坐标从小到大的顺序给出,纵坐标相同时 ...

  3. POJ 2352 Stars(树状数组)

    Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30496   Accepted: 13316 Descripti ...

  4. POJ 2352

    ---恢复内容开始--- http://poj.org/problem?id=2352 这是一个树状数组的题目,也是我第一次接触这类的题目,也正是因为之前的一道题,TLE了,超时太严重了,我看disc ...

  5. 【树状数组】POJ 2352 Stars

    /** * @author johnsondu * @time 2015-8-22 * @type Binary Index Tree * ignore the coordinate of y and ...

  6. hdu 1541/poj 2352:Stars(树状数组,经典题)

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. POJ 2352 Stars(HDU 1541 Stars)

    Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 41521   Accepted: 18100 Descripti ...

  8. [POJ] 2352 Stars [线段树区间求和]

    Stars Description Astronomers often examine star maps where stars are represented by points on a pla ...

  9. POJ 2352 &amp;&amp; HDU 1541 Stars (树状数组)

    一開始想,总感觉是DP,但是最后什么都没想到.还暴力的交了一发. 然后開始写线段树,结果超时.感觉自己线段树的写法有问题.改天再写.先把树状数组的写法贴出来吧. ~~~~~~~~~~~~~~~~~~~ ...

随机推荐

  1. RabbitMQ十:重要方法简述(参数)

    主要方法 前言 经过前面的学习,RabbitMQ 已经拙见有一定认识和了解,今天主要针对我们在前面学习方法进行一次小总结,本篇文章也想在开头写的,但是后来考虑,如果我都把方法都一一列举,我想大家都没很 ...

  2. AJPFX关于枚举,泛型详解

    枚举类型是JDK5.0的新特征.Sun引进了一个全新的关键字enum来定义一个枚举类.下面就是一个典型枚举类型的定义:public enum Color{RED,BLUE,BLACK,YELLOW,G ...

  3. Elasticsearch (2) - 映射

    常用映射类型 核心的字段类型如下: String 字符串包括text和keyword两种类型: 1.text analyzer 通过analyzer属性指定分词器. 下边指定name的字段类型为tex ...

  4. datetime 模块详解

    1.import datetime 常用方法: ttimedelta() 括号里默认为days,进行别的单位运算可以加上如hours = 1这样.除了进行减法运算,还可以进行加法运算. >> ...

  5. 46 Simple Python Exercises-Higher order functions and list comprehensions

    26. Using the higher order function reduce(), write a function max_in_list() that takes a list of nu ...

  6. 手写MVVM框架 之vue双向数据绑定原理剖析

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Android(java)学习笔记160:开发一个多界面的应用程序之清单文件

    清单文件的重要参数:     <intent-filter>             代表的应用程序的入口界面           <action android:name=&quo ...

  8. JS 冒泡事件顺序

    参考:https://www.cnblogs.com/diaoyan/p/5630014.html

  9. django 模板中{%for%}的使用

    1.{%for athlete in list reversed%}  reversed用于反向迭代 2.for 标签 支持一个可选的 empty 变量 3.forloop 模板变量 4.forloo ...

  10. python 一些函数和类用法记录

    这一篇主要用来记录在学习过程中遇到的一些觉得有意思的函数或者类的用法,有一些用法感觉很炫酷. 1.collections.defaultdict from collections import def ...