牛客练习赛34 F 主席树

这题和我之前做的mex原理等价

比赛的时候虚树开的太长了

爆内存的时候返回的wa

我一直以为是代码写的有问题

其实权值线段树的长开n+1就够了

代码只有39行

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
struct ContinueTree{
    int l,r,Min,sum;
    #define l(x) Tree[x].l
    #define r(x) Tree[x].r
    #define Min(x) Tree[x].Min
    #define sum(x) Tree[x].sum
}Tree[25*N];
int tot=0,to=0,A[N],R[N],RR[N];
void Insert(int &x,int l,int r,int p,int v){
    Tree[++tot]=Tree[x];x=tot;sum(x)++;
    if(l==r){Min(x)=v;return;}
    int mid=(l+r)/2;
    if(p<=mid) Insert(l(x),l,mid,p,v);
    else Insert(r(x),mid+1,r,p,v);
    Min(x)=min(Min(l(x)),Min(r(x)));
}
int Query(int x,int y,int l,int r,int v){
    if(l==r) return sum(y)-sum(x);
    int mid=(l+r)/2;
    if(Min(l(y))<v) return Query(l(x),l(y),l,mid,v);
    else return Query(r(x),r(y),mid+1,r,v)+sum(l(y))-sum(l(x));
}
int main(){
    int n,m;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&A[i]);
        Insert(R[i]=R[i-1],1,n+1,A[i]>n?n+1:A[i],i);
    }
    scanf("%d",&m);
    while(m--){
        int l,r;
        scanf("%d%d",&l,&r);
        printf("%d\n",r-l+1-Query(R[l-1],R[r],1,n+1,l));
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值