题目链接

题意:在一个二维平面上有n个星星,每个星星的等级为x,x为该星星左方和下方所包含的星星的数量(包含正左和正下的),输出每个等级各有多少星星,星星坐标按照y序递增给出,y值相同按照x递增给出。

题解:因为已经排好序了,我们每次更新加查询就可以了,因为后加入的一定是下方或者同行的,查询一下是不是左面的就行了。可以用线段树或者树状数组做,注意建树是N不是n,区间更新问题好像可以用什么lazy标记,这道题主要考察的还是思路。注意本题是按照值来进行查询的,建树的时候要用N建树。

#include <cstdio>
#include <cstring>
using namespace std;
#define m ((l+r)>>1)
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
#define N 32005
struct Tree
{
int l,r,sum;
}tree[N<<];
int ans[N<<];
//也可以不创建树
void build(int rt,int l,int r)
{
tree[rt].l=l;
tree[rt].r=r;
if(l==r) return;
build(lson);
build(rson);
}
void update(int rt,int l,int r,int data)
{
tree[rt].sum++;
if(l==r) return;
if(data<=m) update(lson,data);
else update(rson,data);
}
int query(int rt,int l,int r,int ll,int rr)
{
if(ll==l&&rr==r)
{
return tree[rt].sum;
}
if(rr<=m) return query(lson,ll,rr);
else if(ll>m) return query(rson,ll,rr);
else return query(lson,ll,m)+query(rson,m+,rr);
}
int main()
{
int x,y,n;
while(scanf("%d",&n)!=EOF)
{
build(,,n);
//puts("111");
memset(ans,,sizeof(ans));
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
x++;
//注意这里是N
ans[query(,,N,,x)]++;
update(,,N,x);
}
for(int i=;i<n;i++)
printf("%d\n",ans[i]);
}
return ;
}

最新文章

  1. 《黑客反汇编揭秘》(2e)推荐书单
  2. APP开发流程
  3. thinkphp 的save()不能更新数据解决办法
  4. 【转载】C++异常机制的学习
  5. Java多线程-新特征-锁(下)
  6. Mysql数据库插入的中文字段值显示问号的问题解决
  7. huhamhire-hosts必备神器!
  8. servlet简介
  9. javascrpit开发连连看记录-小游戏
  10. Linux: Bash基本命令
  11. Ubuntu17.04安装wps
  12. JAVA9模块化详解(一)——模块化的定义
  13. 使用Spring Boot开发Web项目
  14. springboot集成schedule(深度理解)
  15. [Swift]LeetCode347. 前K个高频元素 | Top K Frequent Elements
  16. storm-sql-kafka问题情况
  17. thinkphp5.0验证的封装
  18. elixir环境配置
  19. Mysql 查看表结构的命令
  20. shell编程基础(转载)

热门文章

  1. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
  2. Android Studio解决未识别Java文件(出现红J)问题
  3. iOS - 滑屏方案
  4. FZU 2105Digits Count(线段树 + 成段更新)
  5. nginx_mysql_redis配置
  6. MVC IIS环境部署注意事项
  7. 第四章 --- 关于Javascript 设计模式 之 迭代器模式
  8. 5 Hbase
  9. yum 操作复习
  10. JavaScript - 原型