zoukankan      html  css  js  c++  java
  • P3391 【模板】文艺平衡树(Splay)

    题面

    https://www.luogu.org/problem/P3391

    题解

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    const int start = 100050 ;
    struct node {
      int ch[2],fa;
      int v,siz;
      bool turn;
    } a[100500];
    
    int n,m,cnt;
    
    bool opt(int x) {
      return a[a[x].fa].ch[1]==x;
    }
    
    void pushdown(int now) {
      if (!now || !a[now].turn) return;
      a[now].turn=false;
      swap(a[a[now].ch[0]].ch[0],a[a[now].ch[0]].ch[1]); a[a[now].ch[0]].turn^=1;
      swap(a[a[now].ch[1]].ch[0],a[a[now].ch[1]].ch[1]); a[a[now].ch[1]].turn^=1;
    }
    
    void rotate(int x) {
      int y=a[x].fa,z=a[y].fa; bool s=opt(x);
      pushdown(z); pushdown(y); pushdown(x);
      a[z].ch[opt(y)]=x; a[x].fa=z;
      a[y].ch[s]=a[x].ch[1^s]; a[a[x].ch[1^s]].fa=y;
      a[y].fa=x; a[x].ch[1^s]=y;
      a[y].siz=a[a[y].ch[0]].siz+a[a[y].ch[1]].siz+1;
      a[x].siz=a[a[x].ch[0]].siz+a[a[x].ch[1]].siz+1;
    }
    
    void splay(int now,int to) {
      while (a[now].fa!=to) {
        if (a[a[now].fa].fa==to) rotate(now);
        else {
          if (opt(now)==opt(a[now].fa)) rotate(a[now].fa),rotate(now);
          else rotate(now),rotate(now);
        }
      }
    }
    
    void insert(int x) {
      int now=start;
      while (a[now].ch[x>a[now].v]) a[now].siz++,now=a[now].ch[x>a[now].v];
      a[now].siz++; a[now].ch[x>a[now].v]=++cnt;
      a[cnt]=(node){0,0,now,x,1,0};
      splay(cnt,start);
    }
    
    int findbyrank(int rk) {
      int cnr=0,now=start;
      while (1) {
        pushdown(now);
        if (cnr+a[a[now].ch[0]].siz==rk) return now;
        else {
          if (cnr+a[a[now].ch[0]].siz>rk) now=a[now].ch[0];
          else cnr+=a[a[now].ch[0]].siz+1,now=a[now].ch[1];
        }
      }
    }
    
    void print(int now) {
      if (!now) return;
      pushdown(now);
      print(a[now].ch[0]);
      if (a[now].v>=1 && a[now].v<=n) printf("%d ",a[now].v);
      print(a[now].ch[1]);
    }
    
    int main(){
      int i,l,r;
      scanf("%d %d",&n,&m);
      a[start]=(node){0,0,0,-1,1,0};
      cnt=0;
      for (i=0;i<=n+1;i++) {
        //printf("%d
    ",i);
        insert(i);
      }
      for (i=1;i<=m;i++) {
        //printf("%d
    ",i);
        scanf("%d %d",&l,&r);
        int lx=findbyrank(l),rx=findbyrank(r+2);
        splay(lx,start);
        splay(rx,lx);
        swap(a[a[rx].ch[0]].ch[0],a[a[rx].ch[0]].ch[1]);
        a[a[rx].ch[0]].turn^=1;
      }
      print(start);
    }
  • 相关阅读:
    二叉树的遍历以及创建——by leona
    利用图像压缩模型抵御对抗样本 by ch
    卡尔曼滤波器及其扩展的个人学习笔记~
    用GAN进行图像压缩 by ch
    用深度学习进行图像压缩 by ch
    3D目标检测&6D姿态估计之SSD-6D算法--by leona
    如何搭建三维重建工程体系
    C++面对对象(一)
    Pybind11教程
    C++的debug和release区别
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11427332.html
Copyright © 2011-2022 走看看