萌新树套树TLE#10求助
查看原帖
萌新树套树TLE#10求助
357440
NullNone楼主2023/2/27 10:41
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN=1e5+5,MAXM=2e5+5;
int n,k,ans[MAXN];
struct pos{
    int a,b,c,idx;
    inline bool operator<(const pos&other)const{
        return this->c<other.c;
    }
    inline void read(int idx){
        this->idx=idx;
        cin>>this->a>>this->b>>this->c;
    }
}ps[MAXN];
struct SegmentTreeT2{
    vector<int>val={0};
    vector<int>ls={0};
    vector<int>rs={0};
    int mem=0;
    inline void update(int idx){val[idx]=(ls[idx]?val[ls[idx]]:0)+(rs[idx]?val[rs[idx]]:0);}
    inline void create(){
        val.push_back(0);
        ls.push_back(0);
        rs.push_back(0);
        mem++;
    }
    void change(int pos,int lt,int rt,int idx){
        if(lt==rt){
            val[idx]++;
            return; 
        }
        int mid=(lt+rt)>>1;
        if(pos<=mid){
            if(!ls[idx]){
                create();
                ls[idx]=mem;
            }
            change(pos,lt,mid,ls[idx]);
        }else{
            if(!rs[idx]){
                create();
                rs[idx]=mem;
            }
            change(pos,mid+1,rt,rs[idx]);
        }
        update(idx);
    }
    inline void change(int pos){
        change(pos,1,k,0);
    }
    int ask(int st,int en,int lt,int rt,int idx){
        if(st<=lt&&rt<=en)
            return val[idx];
        int mid=(lt+rt)>>1;
        if(en<=mid)
            return ls[idx]?ask(st,en,lt,mid,ls[idx]):0;
        if(st>mid)
            return rs[idx]?ask(st,en,mid+1,rt,rs[idx]):0;
        return (ls[idx]?ask(st,en,lt,mid,ls[idx]):0)+(rs[idx]?ask(st,en,mid+1,rt,rs[idx]):0);
    }
    inline int ask(int st,int en){
        return ask(st,en,1,k,0); 
    }
};
struct FenWickTreeT1{
    SegmentTreeT2 res[MAXM];
    #define lb(x) (x&-x)
    void change(int a,int b){
        if(a>k)
            return;
        res[a].change(b);
        change(a+lb(a),b);
    }
    int ask(int a,int bst,int ben){return a?res[a].ask(bst,ben)+ask(a-lb(a),bst,ben):0;}
    int ask(int ast,int aen,int bst,int ben){return (ast>aen||bst>ben)?0:ask(aen,bst,ben)-ask(ast-1,bst,ben);}
}tree;
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        ps[i].read(i);
    sort(ps+1,ps+n+1);
    int iter;
    for(int i=1;i<=n;){
        iter=i;
        tree.change(ps[iter].a,ps[iter].b);
        iter++;
        while(ps[iter].c==ps[iter-1].c){
            tree.change(ps[iter].a,ps[iter].b);
            iter++;
        }
        iter=i;
        ans[tree.ask(1,ps[iter].a,1,ps[iter].b)]++;
        iter++;
        while(ps[iter].c==ps[iter-1].c){
            ans[tree.ask(1,ps[iter].a,1,ps[iter].b)]++;
            iter++;
        }
        i=iter;
    }
    for(int i=1;i<=n;i++)
        cout<<ans[i]<<endl;
    return 0;
}
2023/2/27 10:41
加载中...