数据结构作业——魔法少女(平衡二叉树)
魔法少女之相亲大会
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;
}
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆

浙公网安备 33010602011771号