ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

162 文艺平衡树 Splay

2022-07-20 20:02:40  阅读:141  来源: 互联网

标签:rotate int void tr 文艺 Splay tag 162 size


视频链接:

// Luogu P3391 【模板】文艺平衡树
#include <iostream>
#include <algorithm>
using namespace std;

const int N=100010;
int n, m;
struct node{
  int s[2], p, v;
  int size, tag;
  void init(int p1,int v1){
    p=p1; v=v1; size=1;
  }
}tr[N];
int root,idx;

void pushup(int x){
  tr[x].size=tr[tr[x].s[0]].size
      +tr[tr[x].s[1]].size+1;
}
void pushdown(int x){ //下传
  if(tr[x].tag){
    swap(tr[x].s[0],tr[x].s[1]);
    tr[tr[x].s[0]].tag ^= 1;
    tr[tr[x].s[1]].tag ^= 1;
    tr[x].tag = 0;
  }
}
void rotate(int x){
  int y=tr[x].p, z=tr[y].p;
  int k = tr[y].s[1]==x;
  tr[y].s[k] = tr[x].s[k^1];
  tr[tr[x].s[k^1]].p = y;
  tr[x].s[k^1] = y;
  tr[y].p = x;
  tr[z].s[tr[z].s[1]==y] = x;
  tr[x].p = z;
  pushup(y), pushup(x);
}
void splay(int x, int k){
  while(tr[x].p!=k){
    int y=tr[x].p, z=tr[y].p;
    if(z!=k)   // 折转底,直转中
      (tr[y].s[0]==x)^(tr[z].s[0]==y)
        ? rotate(x) : rotate(y);
    rotate(x);
  }
  if(k==0) root = x;
}
void insert(int v){
  int x=root, p=0;
  while(x)p=x,x=tr[x].s[v>tr[x].v];
  x = ++idx;
  tr[p].s[v>tr[p].v]=x;
  tr[x].init(p,v);
  splay(x, 0);
}
int get_k(int k){//返回第k个节点编号
  int x=root;
  while(1){
    pushdown(x);
    int y=tr[x].s[0];
    if(tr[y].size+1<k)
      k -= tr[y].size+1,
      x = tr[x].s[1];
    else if(tr[y].size>=k) x=y;
    else return x;           
  }
}
void output(int x){ //中序遍历输出
  pushdown(x);
  if(tr[x].s[0]) output(tr[x].s[0]);
  if(tr[x].v >= 1 && tr[x].v <= n) 
    printf("%d ", tr[x].v);
  if(tr[x].s[1]) output(tr[x].s[1]);
}
int main(){
  insert(-1e6);insert(1e6);//哨兵
  scanf("%d%d", &n, &m);
  for(int i=1;i<=n;i++)insert(i); 
  while(m--){
    // 把[l,r]夹挤到l-1和r+1之间
    int l, r;
    scanf("%d%d", &l, &r);
    l=get_k(l), r=get_k(r+2); 
    splay(l, 0); splay(r, l);
    tr[tr[r].s[0]].tag ^= 1; 
  }
  output(root);
  return 0;
}

 

标签:rotate,int,void,tr,文艺,Splay,tag,162,size
来源: https://www.cnblogs.com/dx123/p/16499642.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有