zoukankan      html  css  js  c++  java
  • poj3468 A Simple Problem with Integers

    普通序列,区间更新,区间查询。

    区间更新:

    每个结点的sum信息,表示以这个结点为根的所有子树结点的和,包括根结点。

    void add(int a, int b, int c) {
      if(a > b) swap(a, b);
      Node *left, *mid, *right, *o;
      split(ss.root, a, left, o);
      split(o, b-a+1, mid, right);
      mid->v += c;
      mid->sum += (i64)c*mid->s;
      mid->lazy += c;
      ss.root = merge(merge(left, mid), right);
    }

     区间求和:

    这个题需要用i64,v与延迟标记lazy,以及sum都应该是i64类型。。

    void query_sum(int a, int b) {
      Node *left, *mid, *right, *o;
      split(ss.root, a, left, o);
      split(o, b-a+1, mid, right);
      printf ( "%lld
    ", mid->sum );
      ss.root = merge(merge(left, mid), right);
    }

    maintain()和pushdown():

    特别注意一下sum。。

      void maintain() {
        s = ch[0]->s + ch[1]->s + 1;
        sum = v;
        if ( ch[0] != null ) sum += ch[0]->sum;
        if ( ch[1] != null ) sum += ch[1]->sum;
      }
      void pushdown() {
        if(lazy) {
          ch[0]->v += lazy;
          ch[0]->sum += lazy*ch[0]->s;
          ch[0]->lazy += lazy;
          ch[1]->v += lazy;
          ch[1]->sum += lazy*ch[1]->s;
          ch[1]->lazy += lazy;
        }
        lazy = 0;
      }
  • 相关阅读:
    C常用字符字符串处理函数
    ipmotool
    It旅程经典报错信息
    带外监控
    zookeeper工作原理解析
    浅析MySQL各种索引
    osx下查看jar文件
    TopCoder SRM624 BuildingHeightEasy 题解
    ViewPager切换动画效果改动
    vim中的高亮全部同样单词的方法
  • 原文地址:https://www.cnblogs.com/Accoral/p/3148791.html
Copyright © 2011-2022 走看看