52pt权值线段树求助
查看原帖
52pt权值线段树求助
283255
__LYY_p楼主2022/11/23 14:17
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+5,N=1e7+5;
class stree {
    private:
    int t[maxn*24],l[maxn*24],r[maxn*24];
    int cnt;
    inline int lc(int root){
        return l[root]?l[root]:l[root]=cnt++;
    }
    inline int rc(int root){
        return r[root]?r[root]:r[root]=cnt++;
    }
    inline int getm(int l,int r){
        return l+((r-l)>>1);
    }
    void add(int root,int l,int r,int x,int k){
        t[root]+=k;
        if(l==r)return;
        //cout<<"!!!";
        int mid=getm(l,r);
        if(x<=mid)add(lc(root),l,mid,x,k);
        else add(rc(root),mid+1,r,x,k);
        return;
    }
    int query_sum(int root,int l,int r,int x,int y){
        if(x<=l&&r<=y){
            return t[root];
        }
        int mid=getm(l,r),ans=0;
        if(x<=mid)ans+=query_sum(lc(root),l,mid,x,y);
        if(mid+1<=y)ans+=query_sum(rc(root),mid+1,r,x,y);
        return ans;
    }
    int query_order(int root,int l,int r,int k){
        //查询第k小的数
        if(l==r)return l;
        int mid=getm(l,r);
        if(t[lc(root)]<k)return query_order(rc(root),mid+1,r,k-t[lc(root)]);
        return query_order(lc(root),l,mid,k);
    }
    public:
    inline void add(int x,int k){
        add(1,1,N,x,k);
        return;
    }
    inline int query_sum(int x,int y){
        return query_sum(1,1,N,x,y);
    }
    inline int query_order(int k){
        return query_order(1,1,N,k);
    }
    stree(){
        cnt=2;
    }
}tr;
int n;
int main() {
    scanf("%d",&n);
    int opt,x;
    for(int i=1;i<=n;i++){
        scanf("%d%d",&opt,&x);
        switch (opt)
        {
        case 1:
            tr.add(x,1);
            break;
        case 2:
            tr.add(x,-1);
            break;
        case 3:
            printf("%d\n",tr.query_sum(1,x));
            break;
        case 4:
            printf("%d\n",tr.query_order(x));
            break;
        case 5:
            printf("%d\n",tr.query_order(tr.query_sum(1,x-1)));
            break;
        case 6:
            printf("%d\n",tr.query_order(tr.query_sum(1,x)+1));
            break;
        default:
            break;
        }
    }
    return 0;
}

rt #6~#11MLE

2022/11/23 14:17
加载中...