树状数组套线段树MLE 90分求助!
查看原帖
树状数组套线段树MLE 90分求助!
65743
滑稽的小宫楼主2021/7/24 08:00

最后一个点一直MLE,不知道怎么优化空间了……

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 200010
#define A 200000
int n,k,ans[N];
class listree{
    public:
    #define lb(x) (x&-x)
    class segtree{
        public:
        int root[N],tot;
        class node{
            public:
            int l,r,lp,rp,sum,lz;
        }a[400*N];
        int newnode(int val,int li,int ri){
            a[++tot].sum=val*(ri-li+1),a[tot].lp=li,a[tot].rp=ri;
            return tot;
        }void newst(int n){
            for(int i=1;i<=n;i++)root[i]=newnode(0,1,n);
            return;
        }void up(int x){
            if(x)a[x].sum=a[a[x].l].sum+a[a[x].r].sum;
            return;
        }void pd(int x){
            int mid=(a[x].lp+a[x].rp)>>1;
            if(!a[x].l)a[x].l=newnode(0,a[x].lp,mid);
            if(!a[x].r)a[x].r=newnode(0,mid+1,a[x].rp);
            a[a[x].l].sum+=a[x].lz*(a[a[x].l].rp-a[a[x].l].lp+1);
            a[a[x].r].sum+=a[x].lz*(a[a[x].r].rp-a[a[x].r].lp+1);
            a[a[x].r].lz+=a[x].lz,a[a[x].l].lz+=a[x].lz,a[x].lz=0;
            return;
        }void ad(int x,int li,int ri,int val){
            if(a[x].rp<li||a[x].lp>ri)return;
            else if(li<=a[x].lp&&a[x].rp<=ri){
                a[x].sum+=val*(a[x].rp-a[x].lp+1),a[x].lz+=val;
                return;
            }pd(x),ad(a[x].l,li,ri,val),ad(a[x].r,li,ri,val),up(x);
            return;
        }void add(int k,int li,int ri,int val){
            ad(root[k],li,ri,val);
            return;
        }int su(int x,int li,int ri){
            if(a[x].rp<li||a[x].lp>ri)return 0;
            else if(li<=a[x].lp&&a[x].rp<=ri)return a[x].sum;
            pd(x);
            return su(a[x].l,li,ri)+su(a[x].r,li,ri);
        }int sum(int k,int li,int ri){
            return su(root[k],li,ri);
        }
    }st;
    void add(int x,int p,int val){
        while(x<=k){
            st.add(x,p,p,val);
            x+=lb(x);
        }return;
    }int sum(int x,int li,int ri){
        int ans=0;
        while(x){
            ans+=st.sum(x,li,ri);
            x-=lb(x);
        }return ans;
    }
}lt;
class data{
    public:
    int a,b,c,i;
    bool operator <(data x)const{
        return a<x.a;
    }
}d[N];
int main(){
    scanf("%d%d",&n,&k);
    lt.st.newst(k);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&d[i].a,&d[i].b,&d[i].c);
        d[i].i=i;
    }std::sort(d+1,d+n+1);
    for(int i=1;i<=n;i++){
        int r=i;
        while(d[r+1].a==d[r].a)r++;
        for(int j=i;j<=r;j++)lt.add(d[j].b,d[j].c,1);
        for(int j=i;j<=r;j++)ans[lt.sum(d[j].b,1,d[j].c)-1]++;
        i=r;
    }for(int i=0;i<n;i++)printf("%d\n",ans[i]);
    return 0;
}
2021/7/24 08:00
加载中...