zoukankan      html  css  js  c++  java
  • BZOJ 1269 【AHOI2006】 文本编辑器

    题目链接:文本编辑器

      这道题没啥好说的,直接上(Splay)就行了,板子题……

      但是我某个地方忘了下放标记导致调了一晚上

      听说有个东西叫(rope)可以直接过?然而我并不会

      保存一发板子:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
    #define maxn 1024*1024*2+10
    
    using namespace std;
    typedef long long llg;
    
    int m,rt,tt,now,n;
    int s[maxn][2],fa[maxn],siz[maxn];
    char ss[maxn],val[maxn];
    bool rev[maxn];
    
    int getint(){
    	int w=0;bool q=0;
    	char c=getchar();
    	while((c>'9'||c<'0')&&c!='-') c=getchar();
    	if(c=='-') c=getchar(),q=1;
    	while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
    	return q?-w:w;
    }
    
    void update(int x){siz[x]=siz[s[x][0]]+siz[s[x][1]]+1;}
    void rotate(int x,int &k){
    	int p=fa[x],g=fa[p];
    	bool l=(x==s[p][1]),r=!l;
    	if(p==k) k=x;
    	else s[g][p==s[g][1]]=x;
    	fa[s[x][r]]=p; s[p][l]=s[x][r];
    	s[x][r]=p; fa[p]=x; fa[x]=g;
    	update(p),update(x);
    }
    
    void splay(int x,int &k){
    	while(x!=k){
    		int p=fa[x],g=fa[p];
    		if(p!=k){
    			if((x==s[p][1])^(p==s[g][1])) rotate(x,k);
    			else rotate(p,k);
    		}
    		rotate(x,k);
    	}
    }
    
    int find(int x){
    	int u=rt,l,r; x++;
    	while(u){
    		l=s[u][0],r=s[u][1];
    		if(rev[u]){
    			rev[l]^=1,rev[r]^=1; rev[u]=0;
    			swap(l,r),swap(s[u][0],s[u][1]);
    		}
    		if(siz[l]+1==x) break;
    		if(siz[l]>=x) u=l;
    		else x-=siz[l]+1,u=r;
    	}
    	return u;
    }
    
    int split(int l,int r){
    	splay(find(l-1),rt); splay(find(r+1),s[rt][1]);
    	return s[s[rt][1]][0];
    }
    
    int build(int l,int r){
    	if(l>r) return 0;
    	int u=++tt,mid=(l+r)>>1;
    	s[u][0]=build(l,mid-1),s[u][1]=build(mid+1,r);
    	fa[s[u][0]]=u,fa[s[u][1]]=u,val[u]=ss[mid];
    	update(u); return u;
    }
    
    int main(){
    	File("a");
    	m=getint(); rt=1; tt=5;
    	s[1][0]=2; s[1][1]=3; s[3][0]=4; s[3][1]=5;
    	fa[4]=fa[5]=3; fa[2]=fa[3]=1;
    	for(int i=5;i;i--) update(i),val[i]=' ';
    	while(m--){
    		scanf("%s",ss); int u,v;
    		if(ss[0]=='M') now=getint();
    		else if(ss[0]=='P') now--;
    		else if(ss[0]=='N') now++;
    		else if(ss[0]=='G') printf("%c
    ",val[find(now+1)]);
    		else if(ss[0]=='I'){
    			n=getint();
    			for(int i=1;i<=n;i++) ss[i]=getchar();
    			v=build(1,n); split(now+1,now); u=s[rt][1];
    			s[u][0]=v; fa[v]=u; while(u) update(u),u=fa[u];
    		}
    		else{
    			n=getint(); u=split(now+1,now+n);
    			if(ss[0]=='R') rev[u]^=1;
    			else{
    				s[fa[u]][0]=0; fa[u]=0;
    				update(s[rt][1]); update(rt);
    			}
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    使用vue.js 引用阿里图标 --无法显示(报错)
    thinkphp5.0如何隐藏index.php入口文件
    thinkphp5.0--编写api,返回json格式
    小程序滑动问题(如何让底层不会跟着滑动)
    thinkphp5.0验证的封装
    git--提交代码
    小程序图片上传
    SVG分组和引用
    总结React写参数的几种方式
    React中使用echarts
  • 原文地址:https://www.cnblogs.com/lcf-2000/p/6392127.html
Copyright © 2011-2022 走看看