1 条题解

  • 0
    @ 2025-10-8 17:08:39

    C62 可持久化线段树 P3567 [POI2014] KUR-Couriers

    #include<bits/stdc++.h>
    using namespace std;
    #define lc(x) tr[x].ls
    #define rc(x) tr[x].rs
    #define mid (l+r)/2
    const int N=5e5+10;
    struct trnode{int ls,rs,siz;}tr[N*40]; int trlen,rt[N],a[N];
    void change(int pre,int &now,int l,int r,int x)
    {
    	now=++trlen;tr[now]=tr[pre];
        tr[now].siz++;
    	if(l==r){return ;}
    	if(x<=mid) change(lc(pre),lc(now),l,mid,x);
    	else       change(rc(pre),rc(now),mid+1,r,x);
    }
    int query(int pre,int now,int l,int r,int k)
    {
        if(l==r) return l;
        int s1=tr[lc(now)].siz-tr[lc(pre)].siz;
        int s2=tr[rc(now)].siz-tr[rc(pre)].siz;
        if(k<=s1) return query(lc(pre),lc(now), l, mid, k);
        if(k<=s2) return query(rc(pre),rc(now), mid+1, r, k);
        return 0;
    }
    int main()
    {
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++) scanf("%d",&a[i]);
        trlen=0;rt[0]=0;
        for(int i=1; i<=n; i++) change(rt[i-1],rt[i],1,n,a[i]);
        for(int i=1,x,y; i<=m; i++)
        {
            scanf("%d%d",&x,&y);if(x>y)swap(x,y);
            printf("%d\n", query(rt[x-1],rt[y],1,n,(y-x+1)/2+1));
        }
        return 0;
    }
    
    • 1

    C62 可持久化线段树[POI 2014] KUR-Couriers

    信息

    ID
    5189
    时间
    4000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    34
    已通过
    10
    上传者