题目链接:

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. D. Tavas and Malekas DFS模拟 + kmp + hash || kmp + hash

    http://codeforces.com/contest/535/problem/D 如果真的要把m个串覆盖上一个串上面,是可以得,不会超时. 要注意到一点,全部覆盖后再判断时候合法,和边放边判断, ...

  2. 微服务dubbo面试题

    dubbo的工作原理? dubbo支持的序列化协议? dubbo的负载均衡和高可用策略?动态代理策略? dubbo的SPI思想? 如何基于dubbo进行服务治理.服务降级.失败重试以及超时重试? du ...

  3. poj1857 To Europe! To Europe!

    思路: 一维dp. 实现: #include <cstdio> #include <iostream> using namespace std; const int INF = ...

  4. sass 常用用法笔记

    最近公司开发的h5项目,需要用到sass,所以领导推荐让我去阮一峰大神的SASS用法指南博客学习,为方便以后自己使用,所以在此记录. 一.代码的重用 1.继承:SASS允许一个选择器,继承另一个选择器 ...

  5. jsp <%@ include %> 例子

    <%@ include %>:所有代码包含进来之后一起进行处理,最终编译成一个servlet. jsp文件中添加top和bottom.jsp页面 empList.jsp <%@ pa ...

  6. 几个windows使用小技巧

    windows使用技巧 保存网页上图片时,可以按住左键把图片拖到右下角(win+D,双屏幕直接拖动)然后就可以放在桌面啦 放大镜-->Win+加号或者减号(放大或缩小).Win + Esc(退出 ...

  7. 洛谷 P1351 联合权值

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  8. elasticsearch httpclient认证机制

    最近公司单位搬迁,所有的服务都停止了,我负责的elasticsearch不知道怎么回事,一直不能运行呢,因此,我一直在负责调试工作.经过两天的调试工作,我发现新的服务器增加了httpclient认证机 ...

  9. x86和i386

    x86: 1 9 7 8年6月,I n t e l公司推出了8 0 8 6,一个1 6位微处理器,它可访问的存储空间达到1 M B. Intel x86家族继续发展,1 9 8 5年出现了3 2位的3 ...

  10. core 中使用 swagger

    引包 代码 public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddMvc().Set ...