zoukankan      html  css  js  c++  java
  • poj 2299

    之前用树状数组做这道题,没发现有什么问题。用线段数组后,总是报 runtime Error。后来发现是数组开小了。

    # include <iostream>
    # include <algorithm>
    # include <memory.h>
    # include <vector>
    
    using namespace std;
    
    const int maxn = 500010;
    
    struct Num {
      int val;
      int pos;
      bool operator <(const Num &a)const {
        return val < a.val;
      }
    }num[maxn];
    
    int n;
    
    
    
    struct Segment {
      // 因为不需要修改
      struct _nod{
        long long nums;
        int l, r;
      } TreeNode[maxn << 2]; //bug 之前开到 [maxn <<1] 直接报 runtime error。 线段树结构占用内存是树状数组的 4 倍,而且查询数据还没有树状数组快! 
      
      void init() {
        memset(TreeNode, 0, sizeof(TreeNode));
      }
    
      void build(int index, int l, int r) {
        int mid = (l+r) >> 1;
        TreeNode[index].l = l; TreeNode[index].r = r;
        if (l == r)
          return;
        build(index <<1, l, mid); build(index << 1|1, mid+1, r);
      }
      
      void add_node(int index, int pos, int l, int r) {
        int mid = (l+r) >> 1;
        if ( l == r) {
          TreeNode[index].nums = 1;
          return;
        }
        if (mid >= pos) {
          add_node(index <<1, pos, l, mid); 
        }
        else {
          add_node(index <<1|1, pos, mid+1, r); 
        }
        TreeNode[index].nums = TreeNode[index<<1].nums + TreeNode[index<<1|1].nums;
      }
      
      long long query(int index, int l, int r) {
        long long sums = 0;
        int mid = 0;
        if (l== TreeNode[index].l and r == TreeNode[index].r)
           return TreeNode[index].nums;
        
        mid = (TreeNode[index].l + TreeNode[index].r) >> 1;
        if (mid >= r)
          return query(index<<1, l, r);
        else if ( l> mid)
          return query(index<<1|1, l, r);
        else
           return query(index<<1,l,mid)+ query(index<<1|1,mid+1, r);       
      }
        
    }T;
    
    
    int main(int argc, char* argv[]){
      
      while (cin >> n&&n) {
        long long  ans = 0;
        T.init();
        if (1 > n)
          break;
        for (int i=0; i<n; i++){
          cin >> num[i].val;
          num[i].pos = i;
        }
        sort(num, num+n);
        
        T.build(1, 1, n);
        
        for (int i =0; i<n; i++){
          ans += T.query(1, 1, n) - T.query(1, 1, num[i].pos+1);
          T.add_node(1, num[i].pos+1, 1, n);
        }
        printf("%lld
    ", ans);
      }
      return 0;
    }
    
  • 相关阅读:
    暑假每周学习进度-7
    暑假每周学习进度-6
    寒假生活05
    寒假生活04
    寒假生活03
    寒假生活02
    寒假生活01
    软件设计师2019模拟小测
    第二周学习记录
    2019秋季学习计划
  • 原文地址:https://www.cnblogs.com/tmortred/p/7921350.html
Copyright © 2011-2022 走看看