POJ 2352 Stars (线段树)

手动博客搬家:本文发表于20170819 22:11:49, 原地址https://blog.csdn.net/suncongbo/article/details/77417650

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

题目大意:给定n个点(n<=15000), 每个点有坐标(x, y) (0<=x, y<=32000), 规定每个点i的level等于满足x[j]<=x[i] && y[j]<=y[i]的点j的个数,求出level值为0, 1, 2, ..., n-1的点分别有几个. y以升序给出, y值相等的以x升序给出。

思路分析:既然y值以升序给出,那问题就简化成了: 给定一个数列a, 求a[1]至a[i-1]共有多少个数在[0, i]之间。
(然后统计一下即可)不难观察到,线段树很适合处理此类问题。
把坐标看成区间,对[0,32000]的区间建线段树,树中的num记录[l, r]区间内的x的个数。
(也可对[0,maxx]区间建树,但是要先求出maxx)每次添加新的节点,找到x应该所在的那个节点,然后沿着递归之路每到一个节点就num++, 直到找到为止。
每次添加之前先询问,询问时求出区间[0,x]所跨子区间的num值之和。
由此算出level, 然后统计即可。
时间复杂度O(n log n).

部分易错点:

  1. 线段树区间从0开始,而不是1.
  2. 线段树的数组要开MAXN的4倍,MAXN = 32000 but not 15000

代码呈现:(Time: 188 MS; Memory: 2248 K; Code: 1452 B)

#include<cstdio>
#include<algorithm>
using namespace std;const int MAXN = 32000;
struct Node
{int left,right,num,tag;
};
int lvl[MAXN+2];
struct SegmentTree
{Node nd[MAXN*4+2];void init(){for(int i=1; i<=MAXN*4; i++){nd[i].left = nd[i].right = nd[i].num = 0;}}void build(int lbound,int rbound,int pos){nd[pos].left = lbound;nd[pos].right = rbound;if(lbound==rbound) return;int mid = (lbound+rbound)/2;build(lbound,mid,2*pos);build(mid+1,rbound,2*pos+1);}void addval(int lbound,int rbound,int val,int pos){nd[pos].num++;if(lbound==rbound) return;int mid = (nd[pos].left+nd[pos].right)/2;if(val<=mid) addval(lbound,mid,val,2*pos);else addval(mid+1,rbound,val,2*pos+1);}int query(int lbound,int rbound,int pos){int mid = (nd[pos].left+nd[pos].right)/2;if(lbound==nd[pos].left && rbound==nd[pos].right) return nd[pos].num;   long long ans;if(rbound<=mid) ans = query(lbound,rbound,2*pos);else if(lbound>mid) ans = query(lbound,rbound,2*pos+1);else ans = query(lbound,mid,2*pos)+query(mid+1,rbound,2*pos+1);return ans;}
};
SegmentTree st;
int a[MAXN+2];
int n;int main()
{int q,lbound,rbound,val;char flag[5];scanf("%d",&n);st.init();st.build(0,MAXN,1); //can be both [0,MAXN] or [0,MAXX]; MAXX is the maximum value of all xfor(int i=1; i<=n; i++){int x,y;scanf("%d%d",&x,&y);lvl[st.query(0,x,1)]++; //must be [0,x]st.addval(0,MAXN,x,1);}for(int i=0; i<n; i++){printf("%d\n",lvl[i]);} return 0;
}

发表于 2018-12-26 22:34 suncongbo 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部

POJ 2352 Stars (线段树)相关推荐

  1. poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★

    poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...

  2. poj 2352 Stars(线段树)

    题目:http://poj.org/problem?id=2352 大意:一些星星有自己的优先级,优先级是x坐标和y坐标小于等于该星星坐标的星星个数 思路:由于这个题的y值是从小到大排列,所以对x建立 ...

  3. POJ - 2352 Stars(线段树/树状数组)

    题目链接:点击查看 题目大意:给出n个星星的坐标,规定每个星星的等级为在它左下方的星星的个数,输出0~n-1每个等级共有多少个星星 题目分析:裸的线段树,因为x坐标和y坐标都已经给排好序了,是按照y升 ...

  4. POJ 2481 Cows POJ 2352 Stars(树状数组妙用)

    题目链接:POJ 2481 Cows POJ 2352 Stars 发现这两个题目都跟求逆序数有着异曲同工之妙,通过向树状数组中插入点的位置,赋值为1,或者++,然后通过求和来判断比当前 点 &quo ...

  5. POJ 2299 Ultra-QuickSort(线段树+离散化)

    题目地址:POJ 2299 这题以前用归并排序做过.线段树加上离散化也能够做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,可是能够利用下标,下标总共仅仅有50w.能够从数字大的開 ...

  6. poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化

    第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...

  7. poj pku 2528 线段树的基础应用

    郁闷了一上午的题目,一直都是WA,找了老半天错,想了很多测试数据还是WA.就连骑单车回家的路上还在想这题.悲剧呀... 做完这个题目才明白线段树不同于其他算法,它只是一种思想,在实际应用中是要根据题意 ...

  8. poj 1151(线段树求面积并)

    解题思路:线段树求面积并,水题 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  9. POJ - 2299 Ultra-QuickSort(线段树+离散化/归并排序)

    题目链接:点击查看 题目大意:给出n个数字,求使用冒泡排序所需要交换的次数 题目分析:这个题n给到了5e5,如果直接冒泡排序的话,的时间复杂度肯定就TLE了,所以不能直接暴力模拟 我们换个思路,这个题 ...

最新文章

  1. Jquery中将数组转换成Json
  2. python数据库操作pymysql
  3. 运维小姐姐说这篇Consul集群和ACL配置超给力(保姆级)
  4. AndroidStudio_安卓原生开发_蓝牙扫描设备_另一种方法---Android原生开发工作笔记145
  5. Centos 6.5-yum安装出现错误解决方案
  6. 什么叫“职业年金”,与养老保险有什么关系?
  7. Kinetic使用注意点--circle
  8. 网上Silverlight项目收集
  9. vue keep-alive
  10. [2010-8-22]
  11. c语言命名规则 [转载]
  12. Linux 实现人脸识别
  13. .net反编译工具Reflector下载
  14. Vue验证座机号的同时验证手机号
  15. 考研408-计算机组成原理-存储系统
  16. java poc_spring系列cve poc编写
  17. 记一次Godaddy域名解析托管到AWS的Route53操作
  18. 在手机端访问pc服务器的方法
  19. 常用的但是容易忘记的css样式..........持续更新,主要自用
  20. HashMap和Iterator迭代器的小用法

热门文章

  1. 3DSlicer10:体系结构1
  2. Access2007及以后的版本中的数据库连接字符串
  3. 转sql exists和not exists用法
  4. 程序的加载和执行(三)——《x86汇编语言:从实模式到保护模式》读书笔记23
  5. LC_ALL=C表示什么?
  6. 聚簇索引、非聚簇索引、普通索引、唯一索引
  7. STM32F4 HAL库开发 -- DMA
  8. LIVE555再学习 -- testRTSPClient 实例
  9. 知识图谱实践篇(四):Apache jena SPARQL endpoint及推理
  10. 从Tensorflow代码中理解LSTM网络