数据结构作业——魔法少女(平衡二叉树)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构作业——魔法少女(平衡二叉树)相关的知识,希望对你有一定的参考价值。
魔法少女之相亲大会
Description
由于之前的相亲大会的组织者太过糟糕,实验室的大家仍然没有摆脱 single dog 的命运!!所以请了魔法少女小风,来帮忙实验室脱单!于是光棍节这天,美少女小风重新组织一波相亲大会。她先让男生们按着帅气值高低,从左到右站成一排,接下来 n 秒,每一秒释放一次巴啦啦小风能量!小风能量随机出现"JX"时:粗线了一名男生,然后这个男生会根据自己的帅气值,走到队列里相应的位置。
小风能量随机出现"XQ"时:粗线了一名女生,女生会说一个心仪的对象的帅气值,然后那名男生就走出队伍,和女生走啦~
小风能量随机出现"WT"时:粗线了一名女生,女生会说一个心仪的对象的位置,可是,这个男生缩他不喜欢女生。所以拒绝了这个女生。此刻输出该名男生的帅气值。
小风能量随机出现"YOU"时:魔法失败,输出“ Single dog!”
当魔法结果为“ XQ”时,保证帅气值一定存在。
数据范围在 int 范围之内。保证队伍中不会存在重复的帅气值。
男生的位置编号从 1 开始。
Input
第一行输入一个整数 n( 0<n<=111111) ,接下来 n 行,每行输入魔法结果 c。
Output
当魔法结果为“ WT”时,输出女生说的位置的帅气值。找不到时输出 0
当魔法结果为“ YOU”时,输出“Single dog!"。
当魔法结果为“ YOU”时,输出“Single dog!"。
Sample Input
10
JX 11
JX 111
JX 1111
WT 1
XQ 11
WT 1
XQ 111
WT 1
WT 1111
YOU
Sample Output
11
111
1111
0
Single dog!
思路
平衡二叉树模板题
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 111119; typedef struct sbtnod { int key,left,right,size; } sbtnode; int sbttail = 0,root = 0; sbtnode tree[maxn]; void rrotate(int& t) { int k = tree[t].left; if (!k) return ; tree[t].left = tree[k].right; tree[k].right = t; tree[k].size = tree[t].size; tree[t].size = tree[tree[t].left].size + tree[tree[t].right].size + 1; t = k; } void lrotate(int& t) { int k = tree[t].right; if (!k) return ; tree[t].right =tree[k].left; tree[k].left = t; tree[k].size = tree[t].size; tree[t].size = tree[tree[t].left].size + tree[tree[t].right].size + 1; t = k; } void maintain(int& t,bool flag) { if (!t) return ; if (!flag) if (tree[tree[tree[t].left].left].size > tree[tree[t].right].size) rrotate(t); else if (tree[tree[tree[t].left].right].size > tree[tree[t].right].size) { lrotate(tree[t].left); rrotate(t); } else return ; else if (tree[tree[tree[t].right].right].size > tree[tree[t].left].size) lrotate(t); else if (tree[tree[tree[t].right].left].size > tree[tree[t].left].size) { rrotate(tree[t].right); lrotate(t); } else return ; maintain(tree[t].left,false); maintain(tree[t].right,true); maintain(t,false); maintain(t,true); } void insert(int& t,int v) { if (!t) { sbttail++; tree[sbttail].key = v; tree[sbttail].size = 1; t = sbttail; } else { tree[t].size++; if (v < tree[t].key) insert(tree[t].left,v); else insert(tree[t].right,v); maintain(t,v >= tree[t].key); } } int del(int& t,int v) { int ret; tree[t].size--; if (v == tree[t].key||(v < tree[t].key && tree[t].left == 0)||(v > tree[t].key && tree[t].right == 0)) { ret=tree[t].key; if (tree[t].left == 0||tree[t].right == 0) t = tree[t].left + tree[t].right; else tree[t].key = del(tree[t].left,tree[t].key + 1); } else { if (v < tree[t].key) ret = del(tree[t].left,v); else ret = del(tree[t].right,v); } return ret; } int select(int &x,int k) { int r = tree[tree[x].left].size + 1; if (k < r) return select(tree[x].left,k); else if (k > r) return select(tree[x].right,k - r); else return tree[x].key; } int main() { int n,val; char opt[10]; scanf("%d",&n); while (n--) { scanf("%s",opt); if (strcmp(opt,"JX") == 0) { scanf("%d",&val); insert(root,val); } else if (strcmp(opt,"XQ") == 0) { scanf("%d",&val); del(root,val); } else if (strcmp(opt,"WT") == 0) { scanf("%d",&val); printf("%d\n",select(root,val)); } else if (strcmp(opt,"YOU") == 0) { printf("Single dog!\n"); } } return 0; }
以上是关于数据结构作业——魔法少女(平衡二叉树)的主要内容,如果未能解决你的问题,请参考以下文章