[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--;
}
原文地址:https://www.cnblogs.com/Accoral/p/3149975.html