[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\n", 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--; }