ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

No Luck -- 主席树

2022-02-16 12:03:15  阅读:134  来源: 互联网

标签:rt node No -- siz mid son int Luck


https://codeforces.com/gym/103388/problem/N

题目理解:

就是给了一个 \(3 \cdot 10^5\)的数组,大概 $ 3 \cdot 10^5$ 个查询,每次询问某个区间内数组中大于等于某个数的数有几个。

AC代码

#include<bits/stdc++.h>
using namespace std;

#define ll long long
const int maxn = 300005;
int n,q,tot,rt[maxn],a[maxn];
struct chairman_tree
{
    int son[2],siz;
} node[maxn*50];
void build(int &rt,int l,int r)
{
    rt = ++tot;
    if(l==r) return;
    int mid = (l + r) >> 1;
    build(node[rt].son[0],l,mid);
    build(node[rt].son[1],mid+1,r);
}
void update(int &rt,int last,int l,int r,int val)
{
    node[rt=++tot] = node[last];
    ++node[rt].siz;
    if(l==r) return;
    int mid = (l + r) >> 1;
    if(val<=mid) update(node[rt].son[0],node[last].son[0],l,mid,val);
    else update(node[rt].son[1],node[last].son[1],mid+1,r,val);
}
int query(int rt1,int rt2,int l,int r,int k)  //询问 rt2-rt1所维护的区间内 大于等于k的数的数量
{
    if(l==r) return l >= k ? node[rt2].siz-node[rt1].siz : 0;
    int mid = (l+r) >> 1;
    if(mid>=k) return node[node[rt2].son[1]].siz-node[node[rt1].son[1]].siz+
        query(node[rt1].son[0],node[rt2].son[0],l,mid,k); //右子树的大小全部加上,继续询问左子树
    else return query(node[rt1].son[1],node[rt2].son[1],mid+1,r,k); //继续询问右子树
}

signed main()
{
    scanf("%d %d",&n,&q);
    build(rt[0],0,100000); //在数据范围内建立权值线段树
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        update(rt[i],rt[i-1],0,100000,a[i]);  //插入
    }
    int m,p,f;
    for(int i=1;i<=q;++i)
    {
        scanf("%d %d %d",&m,&p,&f);
        if(a[m]>=p) puts("0");
        else{
            int l = m + 1,r = m + f;
            printf("%d\n",query(rt[l-1],rt[r],0,100000,p));
        }
    }

    return 0;
}


标签:rt,node,No,--,siz,mid,son,int,Luck
来源: https://www.cnblogs.com/beiy/p/15899822.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有