数据结构作业——魔法少女(平衡二叉树)
魔法少女之相亲大会
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!
思路
平衡二叉树模板题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | #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; } |
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)