【求助】主席树只过了最后一个点,其余全 WA
  • 板块P4137 Rmq Problem / mex
  • 楼主WsW_花逝爆零人
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/8/31 20:23
  • 上次更新2023/11/3 00:09:01
查看原帖
【求助】主席树只过了最后一个点,其余全 WA
349824
WsW_花逝爆零人楼主2023/8/31 20:23

离谱,我看讨论区都是 WA 最后一个点

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+3;
struct node{
    int t;
    int ls,rs;
}tree[maxn<<5];
int tl,size;
int root[maxn];

int n,m;
int a[maxn],l,r;

int copy(int p){
    tree[++tl]=tree[p];
    return tl;
}

int insert(int now,int a,int t,int left,int righ){
    int p=copy(now);
    tree[p].t=max(tree[p].t,t);
//    else tree[p].t=t;
    if(left==righ)return p;
    int mid=left+righ>>1;
    if(a<=mid){
        tree[p].ls=insert(tree[now].ls,a,t,left,mid);
        tree[p].t=min(tree[tree[p].rs].t,t);
    }
    else{
        tree[p].rs=insert(tree[now].rs,a,t,mid+1,righ);
        tree[p].t=min(tree[tree[p].ls].t,t);
    }
    return p;
}

int find(int t,int p,int left,int righ){
//    printf("%d~%d  %d\n",left,righ,tree[p].t);
    
    if(left==righ)return left;
    int mid=left+righ>>1;
    if(tree[tree[p].ls].t<t)return find(t,tree[p].ls,left,mid);
    else return find(t,tree[p].rs,mid+1,righ);
}

int main(){
//    freopen("P4137_1.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        size=max(size,a[i]+1);
    }
    
    
//    tree[0].t=1e9;
    for(int i=1;i<=n;++i){
        root[i]=insert(root[i-1],a[i],i,0,size);
    }
    
    while(m--){
        scanf("%d%d",&l,&r);
        printf("%d\n",find(l,root[r],0,size));
    }
    return 0;
} 
2023/8/31 20:23
加载中...