올드 블라인드 PK 작은 고기 - 범위 세그먼트 트리 + 오프라인

포털 : 오래된 블라인드 PK 작은 고기

문제의 의미 : N의 길이의 시퀀스는 소정의 다른 간격 (L, R) 내의 Q 쿼리는 0 또는 최소 서브 구간 길이이다.
생각 : 다음 제로, [1, L-1]에 대한 간격 [L, R] XOR을 가정하는 배타적 OR [1, R]이다 XOR 연산과 동일하다. 그런 다음 각 지점에 대해, 우리는 0의 최소 간격 길이 간격의 배타적 OR 값의 오른쪽 끝 지점에 보관 한 다음 오른쪽 세그먼트 끝점 쿼리 오름차순을 누릅니다. 그 다음 왼쪽에서 오른쪽으로 통과하는 선분 트리 사용 : 삽입 부의 좌측 단부의 최단 간격 길이가이 점에 상당에서, 오른쪽 끝 지점이 존재하는 그대로 현재 동일한 질의 간격 이송 노드, 질의 [L, R]으로 이동 세그먼트 트리 때문에 요점은 자신의 왼쪽 끝점에서 또한 점에 쿼리 그의 오른쪽 엔드 포인트에 삽입됩니다.
코드 :

#include<bits/stdc++.h>
using namespace std;
int a[500010];
int len[1000000*4],pre[500010];
int c[500010*4];
void update(int rt,int l,int r,int pos,int v){
    if(l==r){
        c[rt]=min(c[rt],v);
        return ;
    }
    int mid=(l+r)/2;
    if(pos<=mid) update(rt<<1,l,mid,pos,v);
    if(mid<pos) update(rt<<1|1,mid+1,r,pos,v);
    c[rt]=min(c[rt<<1],c[rt<<1|1]);
    return ;
}
int query(int rt,int l,int r,int ll,int rr){
    if(ll<=l&&r<=rr){
        return c[rt];
    }
    int res=INT_MAX;
    int mid=(l+r)/2;
    if(ll<=mid) res=min(res,query(rt<<1,l,mid,ll,rr));
    if(mid<rr) res=min(res,query(rt<<1|1,mid+1,r,ll,rr));
    return res;
}
struct ac{
    int l,r,id;
}w[500010];
bool cmp(ac a1,ac a2){
    return a1.r<a2.r;
}
int ans[500010];
int main(){
    int n,Q;
    scanf("%d%d",&n,&Q);
    int sum=0;
    memset(c,0x3f,sizeof c);
    memset(len,-1,sizeof len);
    memset(pre,-1,sizeof pre);
    len[0]=0;
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        sum=sum^a[i];
        if(len[sum]!=-1){
            pre[i]=i-len[sum];
            //cout<<i-pre[i]+1<<" "<<i<<" "<<pre[i]<<endl;
        }
        len[sum]=i;
    }
    for(int i=1;i<=Q;++i){
        scanf("%d%d",&w[i].l,&w[i].r);
        w[i].id=i;
    }
    sort(w+1,w+1+Q,cmp);
    int cnt=1;
    for(int i=1;i<=n;++i){
        if(pre[i]!=-1){
            update(1,1,n,i-pre[i]+1,pre[i]);
        }
        while(w[cnt].r==i){
            ans[w[cnt].id]=query(1,1,n,w[cnt].l,i);
            ++cnt;
        }
    }
    for(int i=1;i<=Q;++i){
        if(ans[i]!=0x3f3f3f3f) printf("%d\n",ans[i]);
        else puts("-1");
    }
    return 0;
}
게시 96 개 원래 기사 · 원의 찬양 (11) · 전망 2264

추천

출처blog.csdn.net/weixin_43769146/article/details/104009692