• [HNOI2004]宠物收养所


    维护一个有序序列,查找小于x的最大值与大于x的最小值。

    这个题的取模操作,深深的坑了。。。

    调了好久,都没发现错误。。

    sum += xx%MOD;这样是不对的!!

    sum = (sum+xx)%MOD;这才是正解。。。。。。

    int find_low(int x) {//小于x的最大值,虚拟结点的v=-INF;
      Node *p = ss.root, *ret = null;
      while ( p != null ) {
        if ( p->v <= x ) ret = p, p = p->ch[1];
        else p = p-> ch[0];
      }
      return ret->v;
    }
    int find_up(int x) {//大于x的最小值,null->v = INF;
      Node *p = ss.root, *ret = null;
      while ( p != null ) {
        if ( p->v >= x ) ret = p, p = p->ch[0];
        else p = p-> ch[1];
      }
      return ret->v;
    }
    void add(int x) {//从小到大插入x, 虚拟结点的v=-INF;
      Node *p = ss.root;
      int k = 0;
      while ( p != null ) {
        p->pushdown();
        if(p->v > x) p = p->ch[0];
        else {
          k += p->ch[0]->s + 1;
          p = p->ch[1];
        }
      }
      Node *left, *right;
      split(ss.root, k, left, right);
      Node *mid = new Node();
      mid->ch[0] = mid->ch[1] = null;                                                             
      mid->s = 1;//很关键
      mid->v = x; //mid->lazy = 0;
    
      ss.root = merge(merge(left, mid), right);
    }
    void del(int x) {//删除x,前提是x一定存在
      int k = 0;//k表示所有比x小的数的个数         
      Node *p = ss.root;                           
      while ( p != null ) {
        //p->pushdown();
        if(p->v >= x) p = p->ch[0];                
        else {
          k += p->ch[0]->s + 1;                    
          p = p->ch[1]; 
        }
      }   
      //printf ( "k=%d
    ", k );                    
      //if(k == 1) return;
      Node *left, *mid, *right, *o;
      split(ss.root, k, left, o);
      split(o, 1, mid, right);
      ss.root = merge(left, right);
      cnt--;
    }
  • 相关阅读:
    设计与声明
    字符串匹配算法——KMP、BM、Sunday
    红黑树——原理
    Linux命令——监视相关
    资源管理
    排序算法——QuickSort、MergeSort、HeapSort(C++实现)
    智能指针——使用与实现
    进程间通信——实现
    构造/析构/赋值运算
    物理内存管理
  • 原文地址:https://www.cnblogs.com/Accoral/p/3149975.html
Copyright © 2020-2023  润新知