题目链接:

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. Centos 6.5安装MySQL-python

    报错信息: Using cached MySQL-python-1.2.5.zip     Complete output from command python setup.py egg_info: ...

  2. JVM 内存机制理解【转自http://www.cnblogs.com/dingyingsi/p/3760447.html】

    我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...

  3. 06.NopCommerce配置邮箱账户

    NopCommerce如果配置让用户注册为通过邮箱注册,并且注册后激活邮箱才可登录,那么我们需要对NopCommerce的邮箱账户进行配置,用来发送邮件用.当然邮件还有很多其他用途,比如发送用户订阅的 ...

  4. asp.net 中文部分显示问号

    很神奇的事情,今天部署了一个网站,页面从数据读取新闻后,有些新闻标题全部显示问题号,有几个新闻能正确显示汉字,然后查看新闻页面又能正常显示汉字. 解决办法: 在异常的页面上加上 < %@ COD ...

  5. Android Platform Version 和 API Level对照

    Platform Version API Level VERSION_CODE Notes Android 5.1 22 LOLLIPOP_MR1 Platform Highlights Androi ...

  6. Android虚拟机电池状态设置

    问题描述: 安装SDK后使用AVD配合APPIUM进行测试,此时虚拟机的电池状态为0%充电中:部分APP会对手机电池状态有要求,不符合要求时,无法安装或打开. 解决思路: 1.Android系统设置( ...

  7. 时间插件-daterangepicker

    一款基于bootstrap的时间插件daterangepicker,顾名思义,主要用于时间区间选择,也可做单个时间选择 demo.1汉化版的一个时间选择案例 <!DOCTYPE html> ...

  8. 关于maven source1.5报错

    是因为maven 默认是1.5编译的 <build>//加上这个配置,把编译给改掉试试 <pluginManagement> <plugins> <plugi ...

  9. asp.net mvc 5 微信接入VB版 - 接入认证

    微信接入官方文档是php的,网上被抄好几遍的代码是c#的,就是没vb的.今天我把这个坑填了,做vb版的接入认证. 首先是照着开发文档把微信接入的模型写好.在Models文件夹新建一个Model Pub ...

  10. (译)IOS block编程指南 1 介绍

    Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...