麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

|BZOJ 3224|平衡樹|Tyvj 1728 普通平衡樹

2019-11-14 11:26:04
字體:
來源:轉載
供稿:網友

BZOJ傳送門 平衡樹模板題,注意相同元素的處理。 Treap:

#include<cstdio> #include<algorithm> #include<cstring> #include<vector> #define ms(i,j) memset(i,j, sizeof i); using namespace std; struct node{ node *ch[2];//左右孩子 int v, r;//值,優先級 int s;//附加值:以當前節點為根的結點數量 int w;//附加值:和當前節點相同值的結點數 void mt() { s = w; if (ch[0]!=NULL) s += ch[0]->s; if (ch[1]!=NULL) s += ch[1]->s; } };int ans;struct treap{ node *root; void rotate(int d, node *&o)//d=0則左旋 d=1則右旋 { node *k = o->ch[d^1]; o->ch[d^1] = k->ch[d]; k->ch[d] = o; o->mt(); k->mt(); o = k; } void insert(int x, node *&o)//插入一個數 { if (o==NULL) { o = new node(); o->v = x; o->r = rand(); o->s = o->w = 1; o->ch[0] = o->ch[1] = NULL; //初值 } else if (o->v==x) o->w++; //有相同直接w++ else { int d = (x < o->v ? 0 : 1); insert(x, o->ch[d]); if (o->ch[d]->r > o->r) rotate(d^1, o); } o->mt(); } void del(int x, node *&o)//刪除一個數 { int d = (x < o->v ? 0 : 1); if (o->v==x)//找到 { if (o->w>1) {o->w--; o->s--;} else//不止一個數就直接w--,s-- if (o->ch[0]==NULL) o = o->ch[1]; else if (o->ch[1]==NULL) o = o->ch[0]; else { int d2 = (o->ch[0]->r > o->ch[1]->r ? 1 : 0); rotate(d2,o); del(x, o->ch[d2]); } } else { del(x, o->ch[d]); } if (o!=NULL) o->mt(); } int rank(int x, node *o)//求x的排名 { int tmp; if (o->ch[0]==NULL) tmp = 0; else tmp=o->ch[0]->s;//求s if (o->v==x) return tmp+1;//找到了 else if (o->v >x) return rank(x,o->ch[0]); else return tmp+o->w+rank(x,o->ch[1]); } int kth(int k, node *o)//求第k小 { if (o==NULL||o->s<k||k<=0) return -1;//不符合要求 int tmp; if (o->ch[0]==NULL) tmp = 0; else tmp = o->ch[0]->s;//求s if (k<=tmp) return kth(k,o->ch[0]); else if (k > tmp+o->w) return kth(k - tmp - o->w,o->ch[1]); else return o->v;//找到了 } void PRed(int x, node *o)//求前驅 { if(o==NULL)return; if(o->v<x) { ans = o->v; pred(x, o->ch[1]); } else pred(x, o->ch[0]); } void succ(int x, node *o)//求后繼 { if(o==NULL)return; if(o->v>x) { ans = o->v; succ(x, o->ch[0]); } else succ(x, o->ch[1]); }};treap tree;int n;int main() { scanf("%d", &n); int opt,x; for (int i=1;i<=n;i++) { scanf("%d%d", &opt, &x); switch(opt) { case 1: tree.insert(x, tree.root); break; case 2: tree.del(x, tree.root); break; case 3: printf("%d/n", tree.rank(x, tree.root)); break; case 4: printf("%d/n", tree.kth(x, tree.root)); break; case 5: tree.pred(x,tree.root); printf("%d/n", ans); break; case 6: tree.succ(x,tree.root); printf("%d/n", ans); break; } } return 0; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 369看片你懂的小视频在线观看 | 国产午夜亚洲精品 | 一级黄片毛片免费看 | 99国产精成人午夜视频一区二区 | av日韩在线免费观看 | 久草久视频 | 91社区电影 | 欧美精品色精品一区二区三区 | 亚洲天堂在线电影 | h视频在线免费观看 | 美女很黄很黄免费的 | 欧美成人综合视频 | 久久国产精品99久久人人澡 | 九九热这里只有精品8 | 性欧美xxxx免费岛国不卡电影 | 性欧美xxxx极品摘花 | 经典三级在线视频 | 欧美一级爱操视频 | 久久99精品久久久久久小说 | 午夜激情视频网站 | 二区三区在线观看 | 九一免费版在线观看 | 叶子楣成人爽a毛片免费啪啪 | 日韩精品中文字幕一区二区 | 日韩精品免费一区二区三区 | 色污视频 | 嗯哈~不行好大h双性 | 日本欧美一区二区三区在线观看 | 毛片毛片| 亚洲日本韩国在线观看 | 久久久久久久久浪潮精品 | 欧美人的天堂一区二区三区 | 精品乱码久久久久 | 女人叉开腿让男人桶 | 国产精品区一区二区三区 | 毛片毛片 | 国产精品久久久久久久久久久久久久久久 | 毛片区 | 视频在线中文字幕 | 最近日本电影hd免费观看 | 成人精品免费在线观看 |