zoukankan      html  css  js  c++  java
  • Poj 2352 Star

      计算星星的等级,星星左下方的其他星星的数目就是那颗星星的等级(可以在同一水平线或竖直线上),由于y、x是递增给出的,第y层增加减少星星数目对y-1层毫无影响。每增加一颗星星(x,y),只需要统计[1-x]区间星星的数目,就能得到它的level值,另外要更新x之后的数组。算法是用树状数组实现的,也可以用线段树,代码如下:

     1 #include <iostream>
     2 #include <cstdio>
     3 using namespace std;
     4 #define Max 32010
     5 int star[Max];
     6 int level[Max];
     7 int Lowbit(int x);
     8 int Sum(int k);
     9 void Update(int k);
    10 int main()
    11 {
    12     //freopen("D:\acm.txt","r",stdin);
    13     int xNum = 0, yNum = 0;
    14     int lineNum = 0;
    15     scanf("%d",&lineNum);
    16     for (int i = 0; i < lineNum; ++i){
    17         scanf("%d%d", &xNum, &yNum);
    18         level[Sum(xNum + 1)]++;//xNum要加1或者一个正整数,避免为0,否则会报错
    19         Update(xNum + 1);
    20     }
    21     for (int i = 0; i < lineNum; ++i)
    22         printf("%d
    ",level[i]);
    23     return 0;
    24 }
    25 int Lowbit(int x){
    26     return x & (-x);//返回最后一个1的位置开始的数
    27 }
    28 int Sum(int k){  //前k项和
    29     int judge = 0;
    30     while (k){
    31         judge = judge + star[k];
    32         k = k - Lowbit(k);//
    33     }
    34     return judge;
    35 }
    36 void Update(int k){//修改第k项,更新之后的内容
    37     while (k < Max){
    38         star[k]++;
    39         k = k + Lowbit(k);
    40     }
    41 }

    附上线段树解决方案(不是我写的),留作以后学习。现在基本是看懂代码,理解思想,真正自己是想不到的,继续努力!

    http://blog.chinaunix.net/uid-22263887-id-1778936.html

    Donghua University
  • 相关阅读:
    Java遍历Map键、值。获取Map大小的方法
    Oracle CASE WHEN 用法介绍
    JS动态改变select选择变更option的index值
    js对select动态添加和删除OPTION
    在js中使用createElement创建HTML对象和元素
    清空select标签中option选项的3种不同方式
    json-lib包笔记
    异常:javax.el.PropertyNotFoundException: Property 'id' not found on ..........
    golang struct的使用
    golang多维数组的切片
  • 原文地址:https://www.cnblogs.com/ohxiaobai/p/4075174.html
Copyright © 2011-2022 走看看