zoukankan      html  css  js  c++  java
  • [AHOI 2006] 可可的文本编辑器

    模板题,读入太鬼畜就抄了sxysxy的神奇读入大法

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<cmath>
    #include<ctime>
    #include<cctype>
    using namespace std;
    typedef long long LL;
    struct NODE{
        NODE *ls,*rs;
        int r,v,s;
        int rev;
        #define size(x) ((x)?(x)->s:0)
        inline NODE(int v):r(rand()),v(v){
            ls=rs=NULL;
            s=1;
            rev=0;
        }
        inline void pushup(){
            s=1+size(ls)+size(rs);
        }
        inline void reverse(){
            if(!this) return;
            swap(ls,rs);
            rev^=1;
        }
        inline void pushdown(){
            if(this && this->rev){
                ls->reverse();
                rs->reverse();
                rev=0;
            }
        }
    };
    typedef NODE *pnode;
    typedef pair<NODE*,NODE*> droot;
    NODE *merge(NODE *a,NODE *b){
        if(!a){b->pushup();return b;}
        if(!b){a->pushup();return a;}
        if(a->r < b->r){
            a->pushdown();
            a->rs=merge(a->rs,b);
            a->pushup();
            return a;
        }
        else {
            b->pushdown();
            b->ls=merge(a,b->ls);
            b->pushup();
            return b;
        }
    }
    droot split(NODE *x,int k){
        if(!x) return droot(NULL,NULL);
        x->pushdown();
        droot r;
        if(size(x->ls) >= k){
            r=split(x->ls,k);
            x->ls=r.second;
            x->pushup();
            r.second=x;
        }
        else {
            r=split(x->rs,k-size(x->ls)-1);
            x->rs=r.first;
            x->pushup();
            r.first=x;
        }
        return r;
    }
    NODE *build(int *a,int n){
        pnode *stk=new pnode[n];
        NODE *last;
        int tp=0;
        for(int i=1;i<=n;i++){
            NODE *p=new NODE(a[i]);
            last=NULL;
            while(tp && stk[tp-1]->r > p->r){
                stk[tp-1]->pushup();
                last=stk[tp-1];
                stk[--tp]=NULL;
            }
            if(tp) stk[tp-1]->rs=p;
            p->ls=last;
            stk[tp++]=p;
        }
        while(tp) stk[--tp]->pushup();
        NODE *r=stk[0];
        delete []stk;
        return r;
    }
    int tmp[1048579*2];
     
    char buf[1<<18],*fs,*ft;
    inline char readc(){
        return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<18,stdin),fs==ft))?0:*fs++;
    }
    inline int get_num(){
        int r;
        char c;
        bool s=false;
        while(c=readc()){
            if(c >= '0' && c <= '9'){
                r=c^0x30;
                break;
            }
            else if(c == '-') s=true;
        }
        while(isdigit(c=readc()))
            r=(r<<3)+(r<<1)+(c^0x30);
        return s?-r:r;
    }
    void readn(int n){
        while(readc() != '
    ');
        for(int i=1;i<=n;i++) tmp[i]=readc();readc();
    }
    void dfs(NODE *o){
        if(!o) return;
        dfs(o->ls);
        if(o->v >= 32 && o->v <= 126) putchar(o->v);
        dfs(o->rs);
    }
    inline void clear(int n){
        while(n--) readc();
    }
     
    int n;
    int main(){
        freopen("editor.in","r",stdin);
        freopen("editor.out","w",stdout);
        int T=get_num();
        int cur=0;
        NODE *t=NULL;
        while(T--){
            char cmd[2];
            while(!isalpha(cmd[0]=readc()));
            if(cmd[0] == 'M'){
                cur=get_num();
            }
            else if(cmd[0] == 'I'){
                n=get_num();
                readn(n);
                NODE *troot=build(tmp,n);
                if(!t) t=troot;
                else {
                    droot ps=split(t,cur);
                    t=merge(ps.first,merge(troot,ps.second));
                }
            }
            else if(cmd[0] == 'D'){
                n=get_num();
                droot ps=split(t,cur);
                droot ps2=split(ps.second,n);
                t=merge(ps.first,ps2.second);
            }
            else if(cmd[0] == 'R'){
                n=get_num();
                droot ps=split(t,cur);
                droot ps2=split(ps.second,n);
                ps2.first->reverse();
                t=merge(ps.first,merge(ps2.first,ps2.second));
            }
            else if(cmd[0] == 'G'){
                clear(2);
                n=1;
                droot ps=split(t,cur);
                droot ps2=split(ps.second,n);
                dfs(ps2.first);
                putchar('
    ');
                t=merge(ps.first,merge(ps2.first,ps2.second));
            }
            else if(cmd[0] == 'P') cur--,clear(3);
            else if(cmd[0] == 'N') cur++,clear(3);
        }
        return(0);
    }
  • 相关阅读:
    【SQL跟踪工具】SQL Profiler 跟踪器
    使用Fiddler调试手机端页面请求/抓包
    SQL 常用判断语句
    VS中常用快捷键
    博客园博客自动生成目录/目录索引
    BZOJ 1135 P3488 LYZ-Ice Skates 线段树+Hall
    BZOJ 4823 老C的方块
    POJ
    BZOJ 1299 [LLH邀请赛]巧克力棒
    BZOJ 2437 [Noi2011]兔兔与蛋蛋
  • 原文地址:https://www.cnblogs.com/KCkowk/p/6484990.html
Copyright © 2011-2022 走看看