• 【[AHOI2006]文本编辑器】


    题目

    多了区间翻转,之后没了

    区间翻转的标记记得在(kth)的时候下传

    代码

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define maxn 2100005
    #define re register
    int n,m,root,len,pos=1;
    char val[maxn],S[maxn],opt[15];
    int fa[maxn],sz[maxn],ch[maxn][2],rev[maxn];
    inline void pushup(int x) {sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;}
    inline void pushdown(int x) {
    	if(!rev[x]) return;
    	std::swap(ch[ch[x][0]][0],ch[ch[x][0]][1]);
    	std::swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);
    	rev[x]=0,rev[ch[x][0]]^=1,rev[ch[x][1]]^=1;
    }
    inline void rotate(int x) {
    	int y=fa[x],z=fa[y],k=ch[y][1]==x,w=ch[x][k^1];
    	ch[z][ch[z][1]==y]=x;ch[x][k^1]=y;ch[y][k]=w;
    	pushup(y),pushup(x),fa[w]=y,fa[y]=x,fa[x]=z;
    }
    inline void splay(int x,int goal) {
    	while(fa[x]!=goal) {
    		int y=fa[x];
    		if(fa[y]!=goal) rotate((ch[y][1]==x)^(ch[fa[y]][1]==y)?x:y);
    		rotate(x);
    	}
    	if(!goal) root=x;
    }
    inline int kth(int now) {
    	int x=root;
    	while(1) {
    		pushdown(x);
    		if(sz[ch[x][0]]+1==now) return x;
    		if(sz[ch[x][0]]>=now) x=ch[x][0];
    			else now-=sz[ch[x][0]]+1,x=ch[x][1];
    	}
    }
    int build(int x,int y,int f) {
    	if(x>y) return 0;
    	if(x==y) {
    		fa[++m]=f,sz[m]=1,val[m]=S[x];
    		return m;
    	}
    	int mid=x+y>>1,rt=++m;
    	fa[rt]=f,val[rt]=S[mid];
    	ch[rt][0]=build(x,mid-1,rt),ch[rt][1]=build(mid+1,y,rt);pushup(rt);
    	return rt;
    }
    int main() 
    {
    	scanf("%d",&n);
        root=1,sz[1]=2,ch[1][1]=2,sz[2]=1,fa[2]=1;m=2;
        while(n--) {
            scanf("%s",opt);
            if(opt[0]=='M') scanf("%d",&pos),pos++;
            if(opt[0]=='P') pos--;
            if(opt[0]=='N') pos++;
            if(opt[0]=='I') {
                scanf("%d",&len);S[0]=getchar();
                for(re int i=1;i<=len;i++) S[i]=getchar();
                int aa=kth(pos),bb=kth(pos+1);
                splay(aa,0),splay(bb,aa);
                int t=ch[root][1],rt=build(1,len,t);
                ch[t][0]=rt;pushup(t);splay(t,0);
            }
            if(opt[0]=='D') {
                scanf("%d",&len);
                int aa=kth(pos),bb=kth(pos+len+1);
                splay(aa,0),splay(bb,aa);
                ch[ch[root][1]][0]=0;pushup(ch[root][1]);splay(ch[root][1],0);
            }
            if(opt[0]=='G') {
            	int aa=kth(pos),bb=kth(pos+2);
    			splay(aa,0),splay(bb,aa);
    			putchar(val[ch[ch[root][1]][0]]);
    			if(val[ch[ch[root][1]][0]]!=10) putchar(10);
    		}
    		if(opt[0]=='R') {
    			scanf("%d",&len);
    			int aa=kth(pos),bb=kth(pos+len+1);
    			splay(aa,0),splay(bb,aa);
    			int t=ch[ch[root][1]][0];
    			std::swap(ch[t][1],ch[t][0]),rev[t]^=1;
    		}
        }
    	return 0;
    }
    
  • 相关阅读:
    phpStorm 安装配置
    node.js 模块之url和querystring模块
    node.js模块之util模块
    JAVA设计模式(09):结构型-代理模式(Proxy)
    VB.NET版机房收费系统---七仙女之系统登录
    Guava Collect
    win7 vs2010 安装cocos2d-x
    持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接
    安卓kernel自主唤醒系统方法—设置alarm
    JSP导出Excel文件
  • 原文地址:https://www.cnblogs.com/asuldb/p/10364708.html
Copyright © 2020-2023  润新知