zoukankan      html  css  js  c++  java
  • treap修订

      1 #include<cstdio>
      2 #include<cmath>
      3 #include<algorithm>
      4 #include<ctime>
      5 #include<queue>
      6 #include<cctype>
      7 #include<cstring>
      8 #include<iostream>
      9 #define PAU putchar(' ')
     10 #define ENT putchar('
    ')
     11 #define CH for(int d=0;d<=1;d++) if(ch[d])
     12 using namespace std;
     13 const int maxn=200000+10;
     14 struct node{
     15     node*ch[2];int r,v,siz;
     16     void init(){r=rand();siz=1;ch[0]=ch[1]=NULL;return;}
     17     void update(){siz=1;CH{siz+=ch[d]->siz;}return;}
     18 }treap[maxn],*root[maxn],*nodecnt=treap;
     19 queue<node*>RAM;
     20 node*newnode(){
     21     node*x;
     22     if(!RAM.empty()) x=RAM.front(),RAM.pop();
     23     else x=nodecnt++;
     24     x->init();return x;
     25 }
     26 void del(node*&x){RAM.push(x);return;}
     27 void rotate(node*&x,int d){
     28     node*k=x->ch[d^1];x->ch[d^1]=k->ch[d];k->ch[d]=x;
     29     x->update();k->update();x=k;return;
     30 }
     31 void insert(node*&x,int v){
     32     if(!x) x=newnode(),x->v=v;
     33     else{
     34         int d=v>x->v;insert(x->ch[d],v);
     35         if(x->ch[d]->r>x->r) rotate(x,d^1);
     36         else x->update();
     37     } return;
     38 }
     39 void remove(node*&x,int v){
     40     if(x->v==v){
     41         if(x->ch[0]&&x->ch[1]){
     42             int d=x->ch[0]->r>x->ch[1]->r;
     43             rotate(x,d);remove(x->ch[d],v);
     44         }
     45         else{
     46             node*k=x;
     47             if(x->ch[0]) x=x->ch[0];
     48             else x=x->ch[1];
     49             del(k);
     50         }
     51     }
     52     else remove(x->ch[v>x->v],v);
     53     if(x) x->update();return;
     54 }
     55 void print(node*&x){
     56     if(!x) return;
     57     print(x->ch[0]);
     58     printf("%d ",x->v);
     59     print(x->ch[1]);
     60     return;
     61 }
     62 int find(node*x,int rank){
     63     if(x->siz<rank||rank<1) return -1;
     64     int kth=x->ch[0]?x->ch[0]->siz+1:1;
     65     if(kth==rank) return x->v;
     66     if(kth>rank) return find(x->ch[0],rank);
     67     else return find(x->ch[1],rank-kth);
     68 }
     69 int fa[maxn];
     70 int findset(int x){return x==fa[x]?x:fa[x]=findset(fa[x]);}
     71 void merge(node*&x,node*&y){
     72     if(!y)return;if(!x){x=y;del(y);return;}
     73     merge(x,y->ch[0]);
     74     merge(x,y->ch[1]);
     75     insert(x,y->v);
     76     return;
     77 }
     78 void merge(int a,int b){
     79     a=findset(a);b=findset(b);
     80     if(a==b) return;
     81     if(root[a]->siz<root[b]->siz) swap(a,b);
     82     merge(root[a],root[b]);fa[b]=a;
     83     return;
     84 }
     85 inline int read(){
     86     int x=0,sig=1;char ch=getchar();
     87     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
     88     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
     89     return x*=sig;
     90 }
     91 inline char readc(){
     92     char ch=getchar();
     93     while(!isalpha(ch)) ch=getchar();
     94     return ch;
     95 }
     96 inline void write(int x){
     97     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
     98     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
     99     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    100 }
    101 int n,q,v[maxn];
    102 void init(){
    103     srand(time(0));
    104     n=read();q=read();
    105     for(int i=1;i<=n;i++) root[i]=newnode(),v[i]=root[i]->v=read(),fa[i]=i;
    106     return;
    107 }
    108 void work(){
    109     int a,b;char tp;
    110     while(q--){
    111         tp=readc();a=read();b=read();
    112         if(tp=='b') merge(a,b);
    113         else if(tp=='q') write(find(root[findset(a)],b)),ENT;
    114         else{
    115             remove(root[findset(a)],v[a]);
    116             insert(root[findset(a)],b);
    117             v[a]=b;
    118         }
    119     }
    120     return;
    121 }
    122 void print(){
    123     return;
    124 }
    125 int main(){init();work();print();return 0;}
  • 相关阅读:
    python读取 ini 配置文件
    Mysql 存储过程声明及使用
    PAT乙级1002
    Pat乙级1001
    第四届蓝桥杯省赛翻硬币
    蓝桥杯第四届省赛错误票据
    蓝桥杯第四届省赛前缀判断
    蓝桥杯第四届省赛第39级台阶
    蓝桥杯第四届省赛马虎的算式
    蓝桥杯第三届省赛试题取球游戏
  • 原文地址:https://www.cnblogs.com/chxer/p/4672403.html
Copyright © 2011-2022 走看看