zoukankan      html  css  js  c++  java
  • POJ 2352 Stars【树状数组】

    <题目链接>

     题目大意:

     题目给出n个点,这些点按照y坐标的升序,若y相同,则按照x的升序顺序输入,问,在这些点中,左下角的点的数量分别在0~n-1的点分别有多少个,写出它们的对应点数。

     解题分析:

    因为所有点是按照y坐标的升序优先给出,所以后面的点y坐标一定大于等于前面的。于是,判断该点前面有多少点满足在该点的“左下角”,只需看前面的点有几个x坐标小于当前点即可,所以,我们只需要对x坐标建一维树状数组即可求解。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int N =15000+10;
     7 const int M =32000+10;
     8 int tr[M],cnt[N];
     9 int lowbit(int x){return x&(-x);}
    10 void add(int i,int val){
    11     while(i<=M){
    12         tr[i]+=val;
    13         i+=lowbit(i);
    14     }
    15 }
    16 int sum(int i){
    17     int ans=0;
    18     while(i>=1){
    19         ans+=tr[i];
    20         i-=lowbit(i);
    21     }
    22     return ans;
    23 }
    24 int main(){
    25     int n;
    26     while(scanf("%d",&n)!=EOF){
    27         memset(cnt,0,sizeof(cnt));
    28         memset(tr,0,sizeof(tr));
    29         for(int i=0;i<n;i++){
    30             int x,y;
    31             scanf("%d%d",&x,&y);
    32             cnt[sum(x+1)]++;   //之所以将x+1,是因为树状数组最小下标只能为1,而题目所给的x可能为0
    33             add(x+1,1);
    34         }
    35         for(int i=0;i<n;i++)
    36             printf("%d
    ",cnt[i]);
    37     }
    38     return 0;
    39 }

    2018-10-15

  • 相关阅读:
    SNS与在线旅游
    案例分析:荷兰铁路公司的分布式Scrum开发
    不要把简单的事情搞得N复杂(例1)
    魔兽争霸苹果版 mac安装
    UI展现技术总结
    谈使用final关键字
    蓝牙PSKEY的调整
    Android架构详解
    WINCE6.0文件系统选择
    WINCE蓝牙应用开发方式
  • 原文地址:https://www.cnblogs.com/00isok/p/9795529.html
Copyright © 2011-2022 走看看