• bzoj3223 Tyvj 1729 文艺平衡树


    Description

    您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 

    Input

    第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作次数
    接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n 

    Output

    输出一行n个数字,表示原始序列经过m次变换后的结果 

    Sample Input

    5 3

    1 3

    1 3

    1 4

    Sample Output

    4 3 2 1 5

    HINT

    N,M<=100000

    正解:splay。

    其实我原来就做过,但是这回又调了很久。。find本来是非递归的,但是跑不出来,最后没办法改成递归版才过。。

    把l-1旋到根,r+1旋到根的右儿子,然后r+1的左儿子打标记。记得随时下放。

     1 //It is made by wfj_2048~
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <complex>
     5 #include <cstring>
     6 #include <cstdlib>
     7 #include <cstdio>
     8 #include <vector>
     9 #include <cmath>
    10 #include <queue>
    11 #include <stack>
    12 #include <map>
    13 #include <set>
    14 #define inf (1<<30)
    15 #define N (100010)
    16 #define il inline
    17 #define RG register
    18 #define ll long long
    19 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
    20 
    21 using namespace std;
    22 
    23 int ch[N][2],fa[N],sz[N],key[N],lazy[N],st[N],n,m,rt,tot;
    24 
    25 il int gi(){
    26     RG int x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar();
    27     if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x;
    28 }
    29 
    30 il void newnode(RG int &x,RG int k,RG int f){ x=++tot,key[x]=k,sz[x]=1,fa[x]=f; return; }
    31 
    32 il void pushdown(RG int x){ lazy[x]=0,lazy[ch[x][0]]^=1,lazy[ch[x][1]]^=1,swap(ch[x][0],ch[x][1]); return; }
    33 
    34 il void pushup(RG int x){ sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1; return; }
    35 
    36 il void rotate(RG int x){
    37     RG int y=fa[x],z=fa[y],k=ch[y][0]==x;
    38     ch[z][ch[z][1]==y]=x,fa[x]=z;
    39     ch[y][k^1]=ch[x][k],fa[ch[x][k]]=y;
    40     ch[x][k]=y,fa[y]=x,pushup(y),pushup(x); return;
    41 }
    42 
    43 il void splay(RG int x,RG int goal){
    44     RG int top=0; st[++top]=x;
    45     for (RG int i=x;fa[i]!=goal;i=fa[i]) st[++top]=fa[i];
    46     for (RG int i=top;i;--i) if (lazy[st[i]]) pushdown(st[i]);
    47     while (fa[x]!=goal){
    48     RG int y=fa[x],z=fa[y];
    49     if (fa[y]!=goal){
    50         ((ch[z][0]==y)^(ch[y][0]==x)) ? rotate(x) : rotate(y);
    51     }
    52     rotate(x);
    53     }
    54     if (!goal) rt=x; return;
    55 }
    56 
    57 il void insert(RG int &x,RG int k){
    58     while (ch[x][key[x]<k]) x=ch[x][key[x]<k];
    59     newnode(ch[x][key[x]<k],k,x),splay(ch[x][key[x]<k],0); return;
    60 }
    61 
    62 il int find(RG int x,RG int key){
    63     if (lazy[x]) pushdown(x); if (key==sz[ch[x][0]]+1) return x;
    64     if (key<sz[ch[x][0]]+1) return find(ch[x][0],key);
    65     else return find(ch[x][1],key-sz[ch[x][0]]-1);
    66 }
    67 
    68 il void print(RG int x){
    69     if (lazy[x]) pushdown(x);
    70     if (ch[x][0]) print(ch[x][0]);
    71     if (key[x]>=1 && key[x]<=n) printf("%d ",key[x]);
    72     if (ch[x][1]) print(ch[x][1]); return;
    73 }
    74 
    75 il void work(){
    76     n=gi(),m=gi(),newnode(rt,1,0);
    77     for (RG int i=2;i<=n;++i) insert(rt,i);
    78     insert(rt,0),insert(rt,n+1);
    79     for (RG int i=1;i<=m;++i){
    80     RG int l=gi(),r=gi(),x;
    81     x=find(rt,l),splay(x,0);
    82     x=find(rt,r+2),splay(x,rt);
    83     lazy[ch[x][0]]^=1;
    84     }
    85     print(rt); return;
    86 }
    87 
    88 int main(){
    89     File("artist");
    90     work();
    91     return 0;
    92 }
  • 相关阅读:
    Python 操控Mysql
    mysql5.7 root密码重置
    pandas合并两个excel到一个excel
    键盘控制
    激活浏览器窗口
    python的xlwings库读写excel操作总结
    python 读取Excel使用xlwing库
    CMDB(资产管理系统) day1
    Vue之简易的留言板功能
    vue之神奇的动态按钮
  • 原文地址:https://www.cnblogs.com/wfj2048/p/6482965.html
Copyright © 2020-2023  润新知