标签:
Description
Input
Output
Sample Input
Sample Output
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; struct data { int l,r,v,vo; int rnd; }tr[110000]; int size,root,ans1,ans2;///定义全局整型变量默认初值为0; void rturn(int &k) { int t=tr[k].l; tr[k].l=tr[t].r; tr[t].r=k; k=t; } void lturn(int &k) { int t=tr[k].r; tr[k].r=tr[t].l; tr[t].l=k; k=t; } void insert(int &k,int x,int xo) { if(k==0) { size++;///记录已经使用的结构体数目; k=size; tr[k].v=x; tr[k].vo=xo; tr[k].rnd=rand(); return; } if(x>tr[k].v) { insert(tr[k].r,x,xo); if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k); } else { insert(tr[k].l,x,xo); if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k); } } void query_pro(int k,int x)///求x的前驱(前驱定义为小于x,且最大的数); { if(k==0)return; if(tr[k].v<x) { ans1=k; query_pro(tr[k].r,x); } else query_pro(tr[k].l,x); } void query_sub(int k,int x)///求x的后继(后继定义为大于x,且最小的数); { if(k==0)return; if(tr[k].v>x) { ans2=k; query_sub(tr[k].l,x); } else query_sub(tr[k].r,x); } int main() { int n,xo,x; while(scanf("%d",&n)!=EOF&&n) { root=0; size=0; for(int i=0;i<110000;i++) { tr[i].l=0; tr[i].r=0; tr[i].v=0; tr[i].vo=0; tr[i].rnd=0; } insert(root,1000000000,1); while(n--) { scanf("%d %d",&xo,&x); insert(root,x,xo); ans1=0; ans2=0; query_pro(root,x); query_sub(root,x); if(ans1==0) printf("%d %d\n",xo,tr[ans2].vo); else { if(x-tr[ans1].v<=tr[ans2].v-x) printf("%d %d\n",xo,tr[ans1].vo); else printf("%d %d\n",xo,tr[ans2].vo); } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/chen9510/p/5365099.html