zoukankan      html  css  js  c++  java
  • bzoj1507:[NOI2003]Editor

    块状链表模板题

    然而我de了一整天bug,难受

    rmemcpy常数小,大数据相比for大概有0.5s左右的差别

    答案绝对不要一个一个地printf啊!t到死啊! memcpy存下来然后puts,直接从4.8s到0.9s啊啊 哭

    //Achen
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<ctime>
    #include<cmath>
    const int N=5000;
    const int M=20000;
    typedef long long LL;
    using namespace std;
    char p[N+7][M+7],o[N+7],s[N*N+7];
    int T,xx;
    
    template<typename T> void read(T &x) {
        char ch=getchar(); x=0; T f=1;
        while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
        if(ch=='-') f=-1,ch=getchar();
        for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    }
    
    int now,head,sz[N],nx[N];
    
    queue<int>que;
    void del(int x) {sz[x]=nx[x]=0; que.push(x); }
    int ins() {int x=que.front(); que.pop(); return x;}
    
    int find(int &p) {
        for(int i=head;i;i=nx[i]) {
            if(p<=sz[i]) return i;
            p-=sz[i];
        }
    }
    
    void split(int x,int k) {
        if(sz[x]<=k) return;
        int y=ins();
        for(int i=k+1;i<=sz[x];i++) p[y][++sz[y]]=p[x][i];
        sz[x]=k; nx[y]=nx[x]; nx[x]=y;
    }
    
    void merge(int x) {
        int i;
        for(i=nx[x];i&&sz[x]+sz[i]<=M;) {
            for(int j=1;j<=sz[i];j++) p[x][++sz[x]]=p[i][j];
            int tp=i; i=nx[i]; del(tp);
        }    nx[x]=i;
    }
    
    void insert(int len) {
        int k=now,t=0; 
        if(!head) head=ins();
        int tp,x=find(k);
        split(x,k); tp=x;
        while(t<len) {
            int y=ins();
            for(int i=1;i<=M&&t<len;i++) p[y][++sz[y]]=s[++t];
            nx[y]=nx[x];
            nx[x]=y; x=y;
        }
        merge(tp); merge(x);
    }
    
    void erase(int len) {
        int k=now,t=0;
        int x=find(k);
        split(x,k);
        int i=nx[x];
        while(t<len) {
            if(t+sz[i]<=len) {
                int tp=i;
                t+=sz[i];
                i=nx[i];
                del(tp);
            }
            if(t+sz[i]>len) {
                if(t==len) {nx[x]=i; break;}
                split(i,len-t);
                nx[x]=nx[i]; del(i); break;        
            }
        }
        merge(x);
    }
    
    char ans[N*N+7];
    void print(int len) {
        int k=now,t=0;
        int x=find(k);
        int le=min(len,sz[x]-k);
        memcpy(ans,p[x]+k+1,le); t+=le;
        for(x=nx[x];t<len;x=nx[x]) {
            le=min(len-t,sz[x]);
            memcpy(ans+t,p[x]+1,le);
            t+=le;
        } ans[len]=0;
        puts(ans);
    }
    
    int main() {
        read(T);
        for(int i=1;i<=5000;i++) que.push(i); 
        while(T--) {
            if(T==2654) {
                int debug=1;
            }
            scanf("%s",o);
            if(o[0]!='P'&&o[0]!='N') read(xx);
            if(o[0]=='I') {
                for(int i=1;i<=xx;i++) {
                    char ch=getchar();
                    while(ch<32||ch>126) ch=getchar();
                    s[i]=ch;
                }
                insert(xx);
            }
            else if(o[0]=='D') erase(xx);
            else if(o[0]=='G') print(xx);
            else if(o[0]=='M') now=xx;
            else if(o[0]=='P') now--;
            else if(o[0]=='N') now++;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    HDOJ 5414 CRB and String 模拟
    Python标准库:内置函数all(iterable)
    Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack.
    关于TabLayout+ViewPager组合实现多页面滑动
    互联网产品经理应该具备的技能(需求篇)
    【Android】利用自己定义View的重绘实现拖动移动,获取组件的尺寸
    mybatis自己主动生成mapper,dao,映射文件
    Java解析注解
    如日中天的Uber到底是用什么开发语言做到的?
    [Swift]LeetCode1002. 查找常用字符 | Find Common Characters
  • 原文地址:https://www.cnblogs.com/Achenchen/p/8021436.html
Copyright © 2011-2022 走看看