zoukankan      html  css  js  c++  java
  • [bzoj 3224] tyvj 1728 普通平衡树

    题目地址   http://www.lydsy.com/JudgeOnline/problem.php?id=3224

    Description

    您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
    1. 插入x数
    2. 删除x数(若有多个相同的数,因只删除一个)
    3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
    4. 查询排名为x的数
    5. 求x的前驱(前驱定义为小于x,且最大的数)
    6. 求x的后继(后继定义为大于x,且最小的数)

    Input

    第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

    Output

    对于操作3,4,5,6每行输出一个数,表示对应答案

    Sample Input

    10
    1 106465
    4 1
    1 317721
    1 460929
    1 644985
    1 84185
    1 89851
    6 81968
    1 492737
    5 493598

    Sample Output

    106465
    84185
    492737

    HINT

    1.n的数据范围:n<=100000

    2.每个数的数据范围:[-2e9,2e9]


    Treap膜版题

    几个变量打错交到怀疑人生,做题的时候bzoj奇卡无比


      1 #include<cstdio>
      2 #include<cstring>
      3 #include<iostream>
      4 #include<cmath>
      5 #include<algorithm>
      6 using namespace std;
      7 
      8 int read(){
      9     bool flag=0;
     10     char ch;
     11     int re=0;
     12     while((ch=getchar())!='-'&&(ch<'0'||ch>'9'));
     13     ch=='-'?flag=1:re=ch-'0';
     14     while((ch=getchar())>='0'&&ch<='9')  re=re*10+ch-'0';
     15     return flag?-re:re;
     16 }
     17 
     18 void write(int re){
     19     if(re<0){
     20         putchar('-');
     21         re=-re;
     22     }
     23     if(re>=10)  write(re/10);
     24     putchar(re%10+'0');
     25 }
     26 
     27 const int maxn=1e5+5;
     28 struct Splay{
     29     int v,w,size,rnd;
     30     int l,r;
     31     Splay(int v=0,int w=0,int size=0,int rnd=0,int l=0,int r=0):
     32         v(v),w(w),size(size),rnd(rnd),l(l),r(r){}
     33 }t[maxn];
     34 int cnt=0,root;
     35 
     36 inline void update(int x){  t[x].size=t[t[x].l].size+t[t[x].r].size+t[x].w;  }
     37 
     38 inline void rturn(int &x){
     39     int c=t[x].l;  t[x].l=t[c].r;  t[c].r=x;
     40     t[c].size=t[x].size;  update(x);  x=c;
     41 }
     42 
     43 inline void lturn(int &x){
     44     int c=t[x].r;  t[x].r=t[c].l;  t[c].l=x;
     45     t[c].size=t[x].size;  update(x);  x=c;
     46 }
     47 
     48 void ins(int &x,int v){
     49     if(x==0){
     50         cnt++;  x=cnt;
     51         t[cnt]=Splay(v,1,1,rand(),0,0);
     52         return;
     53     }
     54     t[x].size++;
     55     if(t[x].v==v){  t[x].w++;  return;  }
     56     if(v<t[x].v){
     57         ins(t[x].l,v);
     58         if(t[t[x].l].rnd<t[x].rnd)  rturn(x);
     59     }
     60     else{
     61         ins(t[x].r,v);
     62         if(t[t[x].r].rnd<t[x].rnd)  lturn(x);
     63     }
     64 }
     65 
     66 void del(int &x,int v){
     67     if(x==0)  return;
     68     if(t[x].v==v){
     69         if(t[x].w>1){  t[x].w--;  t[x].size--;  return;  }
     70         if(t[x].l*t[x].r==0)  x=t[x].l+t[x].r;
     71         else
     72         if(t[t[x].l].rnd < t[t[x].r].rnd){  rturn(x);  del(x,v);  }
     73         else{  lturn(x);  del(x,v);  }
     74     }
     75     else{
     76         t[x].size--;  
     77         if(v<t[x].v)  del(t[x].l,v);
     78         else  del(t[x].r,v);
     79     }
     80 }
     81 
     82 int rnk(int x,int v){
     83     if(t[x].v==v)  return t[t[x].l].size+1;
     84     if(v<t[x].v)  return rnk(t[x].l,v);
     85     else  return t[t[x].l].size+t[x].w+rnk(t[x].r,v);
     86 }
     87 
     88 int kth(int x,int k){
     89     if(x==0)  return 0;
     90     if(k<=t[t[x].l].size)  return kth(t[x].l,k);
     91     else  if(k>t[t[x].l].size+t[x].w)  return kth(t[x].r,k-t[t[x].l].size-t[x].w);
     92     else  return t[x].v;
     93 }
     94 
     95 int ans;
     96 
     97 void pre(int x,int v){
     98     if(x==0)  return;
     99     if(v>t[x].v){  ans=x;  pre(t[x].r,v);  }
    100     else  pre(t[x].l,v);
    101 }
    102 
    103 void suf(int x,int v){
    104     if(x==0)  return;
    105     if(v<t[x].v){  ans=x;  suf(t[x].l,v);  }
    106     else  suf(t[x].r,v);
    107 }
    108 
    109 int main(){
    110     //freopen("temp.in","r",stdin);
    111     srand(222);
    112     int n=read();
    113     while(n--){
    114         int op=read(),x=read();
    115         switch(op){
    116             case 1:ins(root,x);  break;
    117             case 2:del(root,x);  break;
    118             case 3:write(rnk(root,x));  putchar('
    ');  break;
    119             case 4:write(kth(root,x));  putchar('
    ');  break;
    120             case 5:ans=0;  pre(root,x);  write(t[ans].v);  putchar('
    ');  break;
    121             case 6:ans=0;  suf(root,x);  write(t[ans].v);  putchar('
    ');  break;
    122         }
    123     }
    124     return 0;
    125 }
  • 相关阅读:
    Python readability提取网页正文的优化
    常见的提取网页正文的方法
    正则表达式所有字符解释
    python 模块 chardet下载及介绍
    Sublime Text 3 快捷键汇总
    python 字符编码
    Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器
    Orcal笔记3-DDL-DML
    oracle多表查询和子查询练习
    oracle笔记2-多表查询和子查询
  • 原文地址:https://www.cnblogs.com/ZYBGMZL/p/6797991.html
Copyright © 2011-2022 走看看