zoukankan      html  css  js  c++  java
  • 文艺平衡树

    #include<cstdio>
    #include<algorithm>
    #include<ctime>
    using namespace std;
    int n,m,root,tot = 0;
    
    struct tree{
    	int ls,rs,v,siz,rnd,tag;
    }tr[100005];
    int add(int val)
    {
    	tr[++tot] = (tree){0,0,val,1,rand(),0};
    	return tot;
    }
    void update(int x){tr[x].siz = tr[tr[x].ls].siz + tr[tr[x].rs].siz + 1;}
    void pushdown(int x)
    {
    	if (!x || !tr[x].tag) return;
    	swap(tr[x].ls,tr[x].rs),tr[x].tag = 0;
    	if (tr[x].ls) tr[tr[x].ls].tag ^= 1;
    	if (tr[x].rs) tr[tr[x].rs].tag ^= 1;
    }
    void build(int &rt,int l,int r)
    {
    	if (l > r) return void(rt = 0);
    	int mid = l + r >> 1;
    	rt = add(mid);
    	build(tr[rt].ls,l,mid - 1),build(tr[rt].rs,mid + 1,r);
    	update(rt);
    }
    void split(int rt,int &x,int &y,int k)
    {
    	if (!rt) return void(x = y = 0);
    	pushdown(rt);
    	if (k <= tr[tr[rt].ls].siz) y = rt,split(tr[rt].ls,x,tr[y].ls,k);
    	else x = rt,split(tr[rt].rs,tr[x].rs,y,k - tr[tr[rt].ls].siz - 1);
    	update(rt);
    }
    void merge(int &rt,int x,int y)
    {
    	if (!x || !y) return void(rt = x + y);
    	pushdown(x),pushdown(y);
    	if (tr[x].rnd < tr[y].rnd) rt = x,merge(tr[rt].rs,tr[x].rs,y);
    	else rt = y,merge(tr[rt].ls,x,tr[y].ls);
    	update(rt);
    }
    void reverse(int &rt,int l,int r)
    {
    	int x = 0,y = 0,z = 0;
    	split(rt,x,y,r),split(x,x,z,l - 1);
    	tr[z].tag ^= 1,merge(x,x,z),merge(rt,x,y);
    }
    void dfs(int rt)
    {
    	if (!rt) return;
    	pushdown(rt);
    	dfs(tr[rt].ls);
    	printf("%d ",tr[rt].v);
    	dfs(tr[rt].rs);
    } 
    int main()
    {
    	srand(time(NULL));
    	scanf("%d%d",&n,&m);
    	build(root,1,n);
    	for (int i = 1,q,p; i <= m; i++)
    		scanf("%d%d",&q,&p),reverse(root,q,p);
    	dfs(root);
    }
    
  • 相关阅读:
    二进制,八进制,十六进制,十进制之间的换算
    14简化路径(71)
    13字符串解码(394)
    12 反转每对括号间的子串(1190)
    11 使括号有效的最少添加(921)
    10 K 个一组翻转链表(25)
    9 从链表中删去总和值为零的连续节点(1171)
    8 链表中的下一个更大节点(1019)
    7两两交换链表中的节点(24)
    6 奇偶链表(
  • 原文地址:https://www.cnblogs.com/nibabadeboke/p/15304167.html
Copyright © 2011-2022 走看看