zoukankan      html  css  js  c++  java
  • SGU 187.Twist and whirl

    splay

    不过竟然用reverse一发水过了。。。

    调用STL的代码:(156ms)

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int f[130009];
    int n,m,l,r;
    int main(){
           scanf("%d %d",&n,&m);
           for(int i=1;i<=n;i++) f[i]=i;
           for(int i=1;i<=m;i++){
                  scanf("%d %d",&l,&r);
                  reverse(f+l,f+r+1);
           }
           for(int i=1;i<=n;i++)
                  printf("%d ",f[i]);
    }
    

      

    Splay(46ms)(代码来自网络)

    #include<cstdio>
    #include<algorithm>
    const int MAXn=130000+9;
    struct splay_tree
    {
            int l[MAXn],r[MAXn],f[MAXn],n,root;
            int size[MAXn];
            bool re[MAXn];
            void push(int u)
            {
                    if(re[u])
                    {
                            re[u]=0;
                            if(l[u])
                                    re[l[u]]^=1;
                            if(r[u])
                                    re[r[u]]^=1;
                            std::swap(l[u],r[u]);
                    }
            }
            void update(int u)
            {
                    size[u]=size[l[u]]+size[r[u]]+1;
            }
            void rotate(int x)
            {
                    int y=f[x];
                    push(y);
                    push(x);
                    f[x]=f[y];
                    if(f[y])
                    {
                            if(l[f[y]]==y)
                                    l[f[y]]=x;
                            else
                                    r[f[y]]=x;
                    }
                    f[y]=x;
                    if(x==r[y])
                    {
                            if(l[x])
                                    f[l[x]]=y;
                            r[y]=l[x];
                            l[x]=y;
                    }
                    else
                    {
                            if(r[x])
                                    f[r[x]]=y;
                            l[y]=r[x];                
                            r[x]=y;
                    }
                    update(y);
                    update(x);
            }
            void splay(int u,int aim)
            {
                    int t;
                    while((t=f[u])!=aim)
                            if(f[t]==aim)
                                    rotate(u);
                            else if((l[f[t]]==t)==(l[t]==u))
                                    rotate(t),rotate(u);
                            else rotate(u),rotate(u);
                    if(!aim)
                            root=u;
            }
            void build(int num)
            {
                    size[0]=0;
                    re[0]=0;
                    n=num;
                    root=1;
                    for(int i=1;i<=n;++i)
                    {
                            l[i]=0;
                            r[i]=i+1;
                            f[i]=i-1;
                            size[i]=n-i+1;
                            re[i]=0;
                    }
                    r[n]=0;
                    splay(n,0);
            }
            int find(int rank)
            {
                    if(!rank || rank>n)
                            return 0;
                    for(int u=root;;)
                    {
                            push(u);
                            if(size[l[u]]+1==rank)
                            {
                                    splay(u,0);        
                                    return u;
                            }
                            else if(rank<=size[l[u]])
                                    u=l[u];
                            else
                            {
                                    rank-=size[l[u]]+1;
                                    u=r[u];
                            }
                    }
            }
            void reserve(int a,int b)
            {
                    int pre=find(a-1),suf=find(b+1);
                    if(pre)
                    {
                            splay(pre,0);
                            if(suf)
                            {
                                    splay(suf,pre);
                                    re[l[suf]]^=1;
                            }
                            else re[r[pre]]^=1;
                    }
                    else if(suf)
                    {
                            splay(suf,0);
                            re[l[suf]]^=1;
                    }
                    else re[root]^=1;
            }
            void print(int u)
            {
                    for(;u;u=r[u])
                    {
                            push(u);
                            print(l[u]);
                            printf("%d ",u);
                    }
            }
    }tree;
    int main()
    {
            #ifndef ONLINE_JUDGE
            freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
            #endif
            int n,m,i,j,k;
            scanf("%d%d",&n,&m);
            tree.build(n);
            for(i=1;i<=m;++i)
            {
                    scanf("%d%d",&j,&k);
                    tree.reserve(j,k);
            }
            tree.print(tree.root);
            return 0;
    }
    

      

  • 相关阅读:
    MySQL中的内置系统函数
    Mysql导出表结构及表数据 mysqldump用法
    MySQL事务处理案例演示
    mysql中int、bigint、smallint 和 tinyint的区别详细介绍
    mysql 获取上个月,这个月的第一天或最后一天
    ★MySQL一些很重要的SQL语句
    remix的使用
    nodejs部署智能合约的方法-web3 0.20版本
    js同步-异步-回调
    ganache与metamask
  • 原文地址:https://www.cnblogs.com/keam37/p/3950089.html
Copyright © 2011-2022 走看看