bzoj 3224 Tyvj 1728 普通平衡树

来源:互联网 发布:c语言求根号函数 编辑:程序博客网 时间:2024/06/06 01:27

还是SPLAY啦

坚持每日一道SPLAY

明天开启网络流计划

平衡树的基本操作

#include<bits/stdc++.h>using namespace std;int n,op,x;struct splay_node{    int val,siz,cnt;    splay_node *fa,*son[2];    splay_node(int _val,splay_node *_fa)    {        val=_val;siz=cnt=1;        fa=_fa;son[0]=son[1]=0;    }    bool dir() {  return this==this->fa->son[1];  }    bool cmp(int _val) {  return _val>val;  }}*rt=0;void maintain(splay_node * o){   o->siz=o->cnt;   for(int i=0;i<2;i++)     if(o->son[i])      o->siz+=o->son[i]->siz,o->son[i]->fa=o;}void rorate(splay_node * o){    splay_node * p = o->fa;    int d=o->dir();    p->son[d]=o->son[d^1];    o->son[d^1]=p;    o->fa=p->fa;    if(p->fa) p->fa->son[p->dir()]=o;    maintain(p),maintain(o);}void splay(splay_node * o,splay_node *t){    while(o->fa!=t)    {       splay_node * p = o->fa;       if(p->fa==t) rorate(o);       else if(p->dir()==o->dir()) rorate(p),rorate(o);       else rorate(o),rorate(o);    }    if(!t) rt=o;}void insert(splay_node * &o,splay_node * fa,int val){    if(!o)    {       o=new splay_node(val,fa);       splay(o,0);       return ;    }    if(val>o->val) insert(o->son[1],o,val);    else if(val<o->val) insert(o->son[0],o,val);    else o->cnt++,o->siz++,splay(o,0);}splay_node * find(splay_node *o,int val){    if(!o) return o;    if(val>o->val) return find(o->son[1],val);    else if(val<o->val) return find(o->son[0],val);    else return o;}int rank(int val){    splay_node * o =find(rt,val);    splay(o,0);    if(!o->son[0]) return 1;    else return o->son[0]->siz+1;}void del(int val){    splay_node * o=find(rt,val);    if(!o) return ;    o->cnt--;    o->siz--;    splay(o,0);    if(o->cnt) return ;    if(!o->son[0]&&o->son[1]) rt=o->son[1],o->son[1]->fa=0;    else if(!o->son[1]&&o->son[0]) rt=o->son[0],o->son[0]->fa=0;    else if(!o->son[0]&&!o->son[1]) rt=0 ;    else    {       o->son[0]->fa=0;       splay_node * p=o->son[0];       while(p->son[1]) p=p->son[1];       splay(p,0);       p->son[1]=o->son[1];       maintain(p);    }}int ask(splay_node * o,int k){    if(!o->son[0]&&k<=o->cnt) return o->val;    if(!o->son[0]) return ask(o->son[1],k-o->cnt);    if(o->son[0]->siz>=k) return ask(o->son[0],k);    if(o->son[0]->siz+o->cnt>=k) return o->val;    return ask(o->son[1],k-o->son[0]->siz-o->cnt);}int xiaoyu(int val){    splay_node * o =rt;    int res=0;    while(o)    {       if(o->val>=val) o=o->son[0];       else         res=o->val,o=o->son[1];    }    return res;}int dayu(int val){    splay_node * o =rt;    int res=0;    while(o)    {       if(o->val<=val) o=o->son[1];       else         res=o->val,o=o->son[0];    }    return res;}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)    {       scanf("%d%d",&op,&x);       if(op==1) insert(rt,0,x);       else if(op==2)  del(x);         else if(op==3) printf("%d\n",rank(x));       else if(op==4) printf("%d\n",ask(rt,x));       else if(op==5) printf("%d\n",xiaoyu(x));       else           printf("%d\n",dayu(x));    }}/*201 9646735 9687054 13 9646735 9652571 9152691 532833 9646733 532833 532831 1626415 9739841 9481192 9152692 532836 9591611 5318211 9675212 5318211 343410*/

心得:
1. RE WA TLE 的如果LOJ上有,一定先在LOJ上去做,有数据哇!!!!

原创粉丝点击