zoukankan      html  css  js  c++  java
  • HOJ 2678 Stars

    题意:N个星星(x,y,z),星星的等级等于x,y,z都小于等于它的星星数量,问每个等级有多少星星。

    思路:最暴力的方法是三维树状数组。但是会超内存。所以我们对其中一维先排好序,然后用二维的做。

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=15555,M=1111;
     6 int c[M][M],ans[N];
     7 struct node
     8 {
     9     int x,y,z;
    10 }a[N];
    11 int cmp(node a,node b)
    12 {
    13     if(a.x!=b.x)
    14         return a.x<b.x;
    15     else if(a.y!=b.y)
    16         return a.y<b.y;
    17     return a.z<b.z;
    18 }
    19 int lowbit(int x){
    20     return x&-x;
    21 }
    22 void add(int x,int y,int z)
    23 {
    24     for(int i=x;i<M;i+=lowbit(i))
    25         for(int j=y;j<M;j+=lowbit(j))    
    26             c[i][j]+=z;
    27 }
    28 int q(int x,int y)
    29 {
    30     int sum=0;
    31     for(int i=x;i;i-=lowbit(i))
    32         for(int j=y;j;j-=lowbit(j))
    33             sum+=c[i][j];
    34     return sum;
    35 }
    36 int main()
    37 {
    38     int n,i;
    39     while(scanf("%d",&n)!=EOF)
    40     {
    41         for(i=1;i<=n;i++)
    42             scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
    43         memset(c,0,sizeof(c));
    44         memset(ans,0,sizeof(ans));
    45         sort(a+1,a+n+1,cmp);
    46         for(i=1;i<=n;i++)
    47         {
    48             ans[q(a[i].y+1,a[i].z+1)]++;
    49             add(a[i].y+1,a[i].z+1,1);
    50         }
    51         for(i=0;i<n;i++)
    52             printf("%d%c",ans[i],i==n-1?'
    ':' ');
    53     }
    54     return 0;
    55 } 
  • 相关阅读:
    stl_heap
    关于随机数 C++
    关于if语句的细节
    C++关于智能指针
    sqlyog
    win10 64位 汇编环境
    Qt 乱码
    Vux使用经验
    Flex布局新旧混合写法详解
    【原】npm 常用命令详解
  • 原文地址:https://www.cnblogs.com/L-King/p/5448330.html
Copyright © 2011-2022 走看看