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

 

posted @ 2017-12-11 07:20  啊宸  阅读(121)  评论(0编辑  收藏  举报