68TLE求调
查看原帖
68TLE求调
652856
MaxPAN楼主2025/7/1 17:10
#include <iostream>
using namespace std;

struct Treap{
    struct node{
        int rev,v,sz,r,lc,rc;
    };
    node pool[100005];
    int root;
    void pushup(int o){
        pool[o].sz = pool[pool[o].lc].sz + pool[pool[o].rc].sz + 1;
    }
    void pushrev(int o){
        swap(pool[o].lc,pool[o].rc);
        pool[o].rev ^= 1;
    }
    void pushdown(int o){
        if(pool[o].rev) pushrev(pool[o].lc),pushrev(pool[o].rc);
        pool[o].rev = 0;
    }
    pair<int,int> splitrnk(int o,int k){
        if(!o) return {0,0};
        pushdown(o);
        int s = pool[pool[o].lc].sz + 1;
        if(k < s){
            auto v = splitrnk(pool[o].lc,k);
            pool[o].lc = v.second;
            pushup(o);
            return {v.first,o};
        }
        auto v = splitrnk(pool[o].rc,k-s);
        pool[o].rc = v.first;
        pushup(o);
        return {o,v.second};
    }
    int merge(int a,int b){
        if(!a || !b) return a + b;
        if(pool[a].r < pool[b].r){
            pushdown(a);
            pool[a].rc = merge(pool[a].rc,b);
            pushup(a);
            return a;
        }
        pushdown(b);
        pool[b].lc = merge(a,pool[b].lc);
        pushup(b);
        return b;
    }
    int build(int l,int r,int d){
        if(l > r) return 0;
        int mid = l + r >> 1;
        pool[mid].v = mid;
        pool[mid].rev = false;
        pool[mid].lc = build(l,mid-1,d+1);
        pool[mid].rc = build(mid+1,r,d+1);
        pushup(mid);
        return mid;
    }
    void printtree(int o){
        if(!o) return;
        pushdown(o);
        printtree(pool[o].lc);
        cout << pool[o].v << " ";
        printtree(pool[o].rc);
    }
};

Treap t;

int main(){
	freopen("P3391_4.in","r",stdin);
	freopen("a.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int n,m;
    cin >> n >> m;
    t.root = t.build(1,n,1);
    while(m--){
        int l,r;
        cin >> l >> r;
        auto v = t.splitrnk(t.root,r);
        auto w = t.splitrnk(v.first,l-1);
        t.pushrev(w.second);
        t.root = t.merge(t.merge(w.first,w.second),v.second);
//        cout << m << " " << l << " " << r << endl;
    }
    t.printtree(t.root);

    return 0;
}
2025/7/1 17:10
加载中...