块状链表,MLE,48pts,求助
查看原帖
块状链表,MLE,48pts,求助
911299
possible981楼主2025/7/31 19:59
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
inline int read() {
    int x=0,f=0,ch=getchar();
    while(!isdigit(ch)) f|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return f?-x:x;
}
const int N=1e5+5;
int n,m;
int h=1;
int S=800;
int cnt;
int g[N];
int tot;
struct Block_list {
    vector<int>a[N];
    bool p[N];
    int nxt[N];
    void pre() {
        for(int i=1;i<=n;i++) {
            a[i/S+1].push_back(i);
        }
        a[n/S+1].push_back(INF);
        for(int i=1;i<n/S+1;i++) {
            nxt[i]=i+1;
        }
        cnt=n/S+1;
    }
    int get(int x,int k) {
        if(!p[x]) return k;
        return a[x].size()-k-1;
    }
    int val(int x,int k) {
        return a[x][get(x,k)];
    }
    pair<int,int> pos(int x) {
        int sum=0;
        for(int i=h;i;i=nxt[i]) {
            if(sum+a[i].size()>=x) {
                return make_pair(i,x-sum-1);
            }
            else sum+=a[i].size();
        }
    }
    void put() {
        for(int i=h;i;i=nxt[i]) {
            for(int j=0;j<a[i].size();j++) {
            	if(val(i,j)!=INF)
                printf("%d ",val(i,j));
            }
        }
    }
    void tp(int x) {
    	if(!p[x]) return ;
    	reverse(a[x].begin(),a[x].end());
    	p[x]=false;
	}
    void split(int x,int d) {
        tp(x);
        ++cnt;
        for(int i=d;i<a[x].size();i++) a[cnt].push_back(a[x][i]);
        while(a[x].size()>d) a[x].pop_back();
        nxt[cnt]=nxt[x];
        nxt[x]=cnt;
    }
    void merge(int x,int y) {
        if(a[x].size()+a[y].size()>S*3/2) return ;
        tp(x),tp(y);
        nxt[x]=nxt[y];
        a[x].insert(a[x].end(),a[y].begin(),a[y].end());
        a[y].clear();
    }
    void balance() {
        for(int i=h;i;i=nxt[i]) {
            if(a[i].size()>2*S) split(i,S);
            if(nxt[i]) merge(i,nxt[i]);
        }
    }
    void rev(int l,int r) {
        pair<int,int> L=pos(l);
        pair<int,int> R=pos(r);
        if(L.first==R.first) {
            int t=L.first;
            for(int i=L.second,j=R.second;i<j;i++,--j) {
                swap(a[t][get(t,i)],a[t][get(t,j)]);
            }
            return ;
        }
        split(L.first,L.second);
        split(R.first,R.second+1);
        tot=0;
        for(int i=nxt[L.first];i!=nxt[R.first];i=nxt[i]) {
        	g[++tot]=i;
        	p[i]=!p[i];
		}
		nxt[L.first]=R.first;
		nxt[g[1]]=nxt[R.first];
		for(int i=tot;i>1;--i) nxt[g[i]]=g[i-1];
		balance();
    }
}t;

int main() {
    n=read();
    m=read();
    t.pre();
    while(m--) {
        int l=read(),r=read();
        t.rev(l,r);
    }
    t.put();
    return 0;
}
2025/7/31 19:59
加载中...