zoukankan      html  css  js  c++  java
  • SGU 271 水题。。。。

    手贱,输出的时候没pushdown。。。。。

    就是简单的区间翻转。。

    期末来了,总是淡淡的忧伤,没办法,只能找水题做了

    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <set>
    #include <algorithm>
    using namespace std;
    typedef long long lld;
    #define L x->c[0]
    #define R x->c[1]
    #define KT root->c[1]->c[0]
    const int maxn = 111111;
    struct node {
        struct node *c[2], *fa;
        int id;
        int sz;
        bool flip;
        char name[5];
        inline bool d() {
            return fa->c[0] == this;
        }
        inline void setc(int d, node *s) {
            c[d] = s;
            s->fa = this;
        }
        inline void up() {
            sz = c[0]->sz + c[1]->sz + 1;
        }
        inline void down() {
            if(flip) {
                c[0]->flip ^= 1;
                c[1]->flip ^= 1;
                swap(c[0],c[1]);
                flip = false;
            }
        }
        inline void clear(node *null) {
            c[0] = c[1] = null;
            sz = 1;
        }
    } NODE[2 * maxn], *null = &NODE[0] ;
    int top;
    node* ID[maxn];
    struct SplayTree {
        node* root;
        void Rotate(node *x,int f) {
            node *y = x->fa;
            y->down(); x->down();
            y->setc(!f,x->c[f]);
            x->fa = y->fa;
            if (y->fa != null)    y->fa->setc(!y->d(),x);
            x->setc(f,y);
            y->up();
        }
        void Splay(node *x, node *goal) {
            x->down();
            while (x->fa != goal) {
                x->fa->fa->down(); x->fa->down(); x->down();
                if (x->fa->fa == goal)
                    Rotate(x, x->d());
                else {
                    int f = x->fa->d();
                    x->d() == f ? Rotate(x->fa, f) : Rotate(x, !f);
                    Rotate(x, f);
                }
            }
            x->up();
            if (goal == null) root = x;
        }
        void RTO(int k, node *goal) {
            node *x = root;
            x->down();
            while (L->sz + 1 != k) {
                if(k < L->sz + 1) x = L;
                else {
                    k -= L->sz + 1;
                    x = R;
                }
                x->down();
            }
            Splay(x, goal);
        }
        void build(node* &x,int l,int r,node *fa) {
            if(l > r) return ;
            int m = (l + r) >>1;
            x = new_node(fa,num[m]);
            build(x->c[0],l,m-1,x);
            build(x->c[1],m+1,r,x);
            x->up();
        }
        node *new_node(node *fa,char *s) {
            node *x = &NODE[++top];
            x->id = top;
            x->c[0] = x->c[1] = null;
            x->sz = 1;
            x->flip = false;
            strcpy(x->name,s);
            x->fa = fa;
            return x;
        }
        void ADD(char *s) {
            RTO(1,null);
            RTO(2,root);
            node *tmp = new_node(root->c[1],s);
            root->c[1]->setc(0,tmp);
            root->c[1]->up();
            root->up();
    //      //  debug();
    //        puts("");
    //        print(root);
    //        puts("");
        }
        void ROTATE(int K) {
            if(root->sz-2 <= K) {
                RTO(1,null);
                RTO(root->sz,root);
                KT->flip ^= 1;
            } else {
                RTO(1,null);
                RTO(K+2,root);
                KT->flip ^= 1;
            }
        }
        void print(node *x) {
    
            if(x != null) {
            	x->down();
                print(x->c[0]);
                if(strcmp(x->name,"***")!=0) printf("%s\n",x->name);
                print(x->c[1]);
            }
        }
        void init(int n) {
            for(int i = 0; i < n; i++)  scanf("%s",num[i]);
            root = new_node(null,"***");
            root->c[1] = new_node(root,"***");
            build(KT,0,n-1,root->c[1]);
            root->c[1]->up();
            root->up();
           // debug();
        }
    /*
    0 5 3
    ADD(ABD)
    ADD(XXX)
    ADD(FDA)
    ROTATE
    ADD(wuyi)
     */
        void Del_root() { // delete the root
            node* t = root;
            if (t->c[1] != null) {
                root = t->c[1];
                RTO(1, null);
                root->c[0] = t->c[0];
                if (root->c[0] != null)
                    root->c[0]->fa = root;
            } else
                root = root->c[0];
            root->fa = null;
            if (root != null)
                root->up();
        }
        void vist(node *x) {
            if (x != null) {
                printf("节点:%2d : 左儿子: %2d  右儿子:  %2d  sz: %2d val: %s\n",
                       x->id,x->c[0]->id,x->c[1]->id,x->sz,x->name);
                vist(x->c[0]);
                vist(x->c[1]);
            }
        }
        void debug() {
            puts("************");
            vist(root);
            puts("\n*****************");
        }
        char num[maxn][5];
    } spt;
    void prepare() {
        top = 0;
        null->id = 0;
        null->c[0] = null->c[1] = null->fa = NULL;
        null->sz = 0;
        null->flip = false;
        strcpy(null->name,"***");
    }
    int main() {
        prepare();
        int n , m ,k;
        scanf("%d%d%d",&n,&m,&k);
        spt.init(n);
        char op[20];
        for(int i = 0; i < m; i++) {
            scanf("%s",op);
            if(strcmp(op,"ROTATE") == 0) {
                spt.ROTATE(k);
            } else {
                int len = strlen(op);
                char ta[10];
                int head = 0;
                for(int i = 4; i < len-1; i++) {
                    ta[head++] = op[i];
                }
                ta[head] = 0;
                spt.ADD(ta);
            }
        }
        spt.print(spt.root);
        return 0;
    }
    


  • 相关阅读:
    uniapp--悬浮可拖动按钮-实现思路
    js获取指定日期的前一天/后一天
    适配
    使用了@Slf4j log没有info的方法 .info()方法爆红或者log爆红
    用hexo在本地搭建自己的博客
    gulp 前端构建工具使用
    springboot+idea 热部署
    配置DNS服务器转发器
    windows server2008 r2安装DNS服务器
    卸载jdk1.7
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3127465.html
Copyright © 2011-2022 走看看