hdu 4557 非诚勿扰(平衡树方法)
来源:互联网 发布:中国移动电视网络页面 编辑:程序博客网 时间:2024/05/17 22:39
hdu 4557 非诚勿扰
本题数据小,可暴力水过,这里用SBT练下手
Find相当于求后继,key保存响应的用来比较的数据
#include<stdio.h>#include<string.h>#define MAXN 1005struct person{ char name[17]; int key,kth; bool operator < (const person &a) const { if(key==a.key) return kth<a.kth; return key<a.key; } bool operator > (const person &a) const { if(key==a.key) return kth>a.kth; return key>a.key; } bool operator == (const person &a) const { return key==a.key&&kth==a.kth; }};struct node{ int l,r; person key; int size;}t[MAXN];int top,root;void lRotate(int &p){ int rch=t[p].r; t[p].r=t[rch].l; t[rch].l=p; t[rch].size=t[p].size; t[p].size=t[t[p].l].size+t[t[p].r].size+1; p=rch;}void rRotate(int &p){ int lch=t[p].l; t[p].l=t[lch].r; t[lch].r=p; t[lch].size=t[p].size; t[p].size=t[t[p].l].size+t[t[p].r].size+1; p=lch;}void maintain(int &p,bool flag){ if(!flag) { if(t[t[t[p].l].l].size>t[t[p].r].size) rRotate(p); else if(t[t[t[p].l].r].size>t[t[p].r].size) { lRotate(t[p].l); rRotate(p); } else return ; } else { if(t[t[t[p].r].r].size>t[t[p].l].size) lRotate(p); else if(t[t[t[p].r].l].size>t[t[p].l].size) { rRotate(t[p].r); lRotate(p); } else return ; } maintain(t[p].l, false); maintain(t[p].r, true); maintain(p, false); maintain(p, true);}void insert(int &p,person &key){ if(!p) { p=++top; t[p].l=t[p].r=0; t[p].size=1; t[p].key=key; return ; } else { t[p].size++; if(key<t[p].key) insert(t[p].l,key); else insert(t[p].r,key); maintain(p, !(key<t[p].key)); }}person remove(int &p,person &key){ t[p].size--; if(key==t[p].key ||(key<t[p].key&&!t[p].l) ||(key>t[p].key&&!t[p].r)) { person tkey=t[p].key; if(t[p].l&&t[p].r) { person ttkey=key; ttkey.key++; ttkey.kth++; t[p].key=remove(t[p].l,ttkey); } else p=t[p].l+t[p].r; return tkey; } else if(key<t[p].key) return remove(t[p].l,key); else return remove(t[p].r,key);}int succ(int &p,int pp,int key){ if(p==0) return pp; else if(t[p].key.key>=key) return succ(t[p].l,p,key); else return succ(t[p].r,pp,key);}int main(){ int cas,n,x; char op[7]; person key; scanf("%d",&cas); for(int kcas=1;kcas<=cas;kcas++) { printf("Case #%d:\n",kcas); top=root=0; int cnt=0; scanf("%d",&n); while(n--) { scanf("%s",op); if(op[0]=='A') { scanf("%s%d",key.name,&key.key); key.kth=++cnt; insert(root, key); printf("%d\n",t[root].size); } else { scanf("%d",&x); int id=succ(root,0,x); if(!id) printf("WAIT...\n"); else { printf("%s\n",t[id].key.name); remove(root,t[id].key); } } } } return 0;}
0 0
- hdu 4557 非诚勿扰(平衡树方法)
- hdu 4557 非诚勿扰(非暴力,平衡树treap)
- HDU 4585 平衡树Treap
- hdu 4585 shaolin 平衡树
- 平衡二叉树 构造方法
- 平衡二叉树 构造方法
- 平衡二叉树构造方法
- 平衡二叉树 构造方法
- 平衡二叉树 构造方法
- 平衡二叉树的转换和平衡方法
- HDU 5475 平衡树/线段树
- HDU 4942 [线段树][平衡树]
- hdu-4585-Shaolin 平衡二叉树
- 平衡二叉树的调整方法
- AVL 平衡二叉树旋转方法
- HDU 5349 MZL's simple problem(平衡树 树堆)
- [均摊 平衡树 || 线段树] HDU 5634 Rikka with Phi
- HDU 1540 Tunnel Warfare(平衡树) 解题报告
- ubuntu12.04下搭建Openwrt编译环境
- SecureCRT-vbs
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- Ubuntu主机端nfs服务
- python中的generator解读
- hdu 4557 非诚勿扰(平衡树方法)
- 第7周项目3简单分支问题体验之求出两数的正差值并输出
- Ubuntu下静态IP地址的配置
- java实现二分插入排序
- [ACM Steps] 1.3.2 What Is Your Grade?
- 预处理命令
- 3.在Android上显示摄像头,并在摄像头画面上画图
- atoi(), atol(), itoa(), sprintf() 及 strcat()函数
- BZOJ 2599 IOI 2011 Race 树的分治