社区讨论

萌新求助,关于树套树空间

P1975[国家集训队] 排队参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lobeq9ao
此快照首次捕获于
2023/10/29 19:48
2 年前
此快照最后确认于
2023/11/04 01:24
2 年前
查看原帖
RT.
理论上,序列上的每个数最多会被插入到 logn\log{n} 颗平衡树里,所以平衡树的节点是 nlognn\log n 个。
但是我开 nlognn\log n 个节点却 RE 了,为什么?
以下是代码:
CPP
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>

using namespace std;
namespace FastIO {
    template<typename T> inline void in(T &s){
        int f=1; char c=getchar(); s=0;
        while(!isdigit(c)) { if(c=='-') f=-f; c=getchar(); }
        while(isdigit(c)) s=(s<<3)+(s<<1)+(c^48), c=getchar();
        s*=f;
    }
    template<typename T> inline void out(T s){
        if(s<0) putchar('-'), s=-s;
        if(s>9) out(s/10);
        putchar('0'+s%10);
    }
    template<typename T> inline void outc(T s, char c='\n') { out(s), putchar(c); };
} using namespace FastIO;

typedef unsigned long long uLL;
typedef long long LL;
const int INF=0x3f3f3f3f;

const int _=5, N=2e4, M=2e3, V=1e9, LgN=15;

int n, m, on, res, cnt, o[N+_], h[N+_], a[N+_];

struct fhq_node {
    int v, sz, ls, rs, ky;
    fhq_node () { v=sz=ls=rs=ky=0; }
    fhq_node (int _v) { v=_v, sz=1, ky=rand(), ls=rs=0; }
} t[N*LgN*2+_]; // 这里 qwq

struct fhq_tree {
    int rot;
    fhq_tree () { rot=0; }
    inline int nw(int v) { return t[++cnt]=fhq_node(v), cnt; }
    inline void pushup(int rt) { t[rt].sz=t[t[rt].ls].sz+t[t[rt].rs].sz+1; }
    inline void split(int rt, int vl, int &x, int &y){
        if(!rt) { x=y=0; return ; }
        if(t[rt].v<=vl) x=rt, split(t[rt].rs, vl, t[rt].rs, y);
        else y=rt, split(t[rt].ls, vl, x, t[rt].ls);
        pushup(rt);
    }
    inline int merge(int x, int y){
        if(!x||!y) return x|y;
        if(t[x].ky<t[y].ky){
            t[x].rs=merge(t[x].rs, y);
            pushup(x); return x;
        }else{
            t[y].ls=merge(x, t[y].ls);
            pushup(y); return y;
        }
    }
    inline void insert(int v){
        int x, y;
        split(rot, v, x, y);
        rot=merge(x, merge(nw(v), y));
    }
    inline void erase(int v){
        int x, y, z;
        split(rot, v-1, x, y);
        split(y, v, y, z);
        y=merge(t[y].ls, t[y].rs);
        rot=merge(x, merge(y, z));
    }
    inline int more(int v){
        int x, y, ans;
        split(rot, v, x, y);
        ans=t[y].sz;
        rot=merge(x, y);
        return ans;
    }
    inline int less(int v){
        int x, y, ans;
        split(rot, v-1, x, y);
        ans=t[x].sz;
        rot=merge(x, y);
        return ans;
    }
} bt[(N<<2)+_];

inline int lowbit(int x) { return x&(-x); }
inline void add(int p, int x) { while(p<=n) a[p]+=x, p+=lowbit(p); }
inline int sum(int p) { int s=0; while(p) s+=a[p], p-=lowbit(p); return s; }

inline void build(int rt, int l, int r){
    for(int i=l; i<=r; ++i) bt[rt].insert(h[i]);
    if(l==r) return ;
    int mid=(l+r)>>1;
    build(rt<<1, l, mid), build(rt<<1|1, mid+1, r);
}
inline int mor(int rt, int l, int r, int u, int w){
    if(1<=l&&r<=u) return bt[rt].more(w);
    int ans=0, mid=(l+r)>>1;
    if(1<=mid) ans+=mor(rt<<1, l, mid, u, w);
    if(u>mid) ans+=mor(rt<<1|1, mid+1, r, u, w);
    return ans;
}
inline int les(int rt, int l, int r, int u, int w){
    if(u<=l&&r<=n) return bt[rt].less(w);
    int ans=0, mid=(l+r)>>1;
    if(u<=mid) ans+=les(rt<<1, l, mid, u, w);
    if(n>mid) ans+=les(rt<<1|1, mid+1, r, u, w);
    return ans;
}
inline void mdf(int rt, int l, int r, int u, int w){
    bt[rt].erase(h[u]), bt[rt].insert(w);
    if(l==r) return ;
    int mid=(l+r)>>1;
    if(u<=mid) mdf(rt<<1, l, mid, u, w);
    else mdf(rt<<1|1, mid+1, r, u, w);
}

int main(){
    srand(19260817);
    in(n); for(int i=1; i<=n; ++i) in(h[i]), o[i]=h[i];
    sort(o+1, o+n+1); on=unique(o+1, o+n+1)-o-1;
    for(int i=1; i<=n; ++i){
        int cur=lower_bound(o+1, o+on+1, h[i])-o;
        add(cur, 1), res+=sum(n)-sum(cur);
    }
    outc(res);
    build(1, 1, n);
    in(m); while(m--){
        int a, b, x, y; in(a), in(b); if(a>b) swap(a, b); x=h[a], y=h[b];
        res-=mor(1, 1, n, a, h[a])+mor(1, 1, n, b, h[b]);
        res-=les(1, 1, n, a, h[a])+les(1, 1, n, b, h[b]);
        mdf(1, 1, n, a, y), mdf(1, 1, n, b, x); swap(h[a], h[b]);
        res+=mor(1, 1, n, a, h[a])+mor(1, 1, n, b, h[b]);
        res+=les(1, 1, n, a, h[a])+les(1, 1, n, b, h[b]);
        if(h[a]<h[b]) ++res;
        if(h[a]>h[b]) --res;
        outc(res);
    }
    return 0;
}
谢谢。

回复

3 条回复,欢迎继续交流。

正在加载回复...