bzoj2223 [Coci 2009]PATULJCI

本文介绍了一种使用主席树解决特定区间查询问题的方法。通过构造主席树,并实现插入和查询操作,能够有效地处理区间中位数查找等类似问题。文中提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意就不说了。。

直接上主席树。。无脑。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
int n,m,q;
const int N=2e6;
struct node
{
    int l,r,s;
}t[N*4];
struct nod
{
    int x,id; 
}a[N];
int root[N],tot;
inline void build(int &x,int l,int r)
{
    x=++tot;
    //t[x].s=0;
    if (l==r)return ;
    int mid=(l+r)/2;
    build(t[x].l,l,mid);
    build(t[x].r,mid+1,r);
}
inline void ins(int &x,int y,int k,int l,int r)
{
    x=++tot;
    t[x].s+=t[y].s;
    if (l==r)
    {
        t[x].s++;
        return;
    }
    t[x].l=t[y].l;
    t[x].r=t[y].r;
    int mid=(l+r)/2;
    if (k<=mid)ins(t[x].l,t[y].l,k,l,mid);
    else ins(t[x].r,t[y].r,k,mid+1,r);
    t[x].s=t[t[x].l].s+t[t[x].r].s;
}
inline int query(int d,int p,int k,int l,int r)
{
    if (t[d].s-t[p].s<=k)return 0;
    if (l==r)return l;
    int mid=(l+r)/2;
    if (t[t[d].l].s-t[t[p].l].s>k)return query(t[d].l,t[p].l,k,l,mid);
    else return query(t[d].r,t[p].r,k,mid+1,r);
}
int main()
{
    int lim;
    scanf("%d%d",&n,&lim);
    fo(i,1,n)scanf("%d",&a[i].x);
    build(root[0],1,lim);
    fo(i,1,n)
    ins(root[i],root[i-1],a[i].x,1,lim);
    scanf("%d",&q);
    fo(i,1,q)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        int ans=query(root[r],root[l-1],(r-l+1)/2,1,lim);
        if (!ans)printf("no\n");
        else printf("yes %d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值