换个角度思考 题解

换个角度思考

https://ac.nowcoder.com/acm/problem/19427

看样子,应该有比较好的做法,不过,这道题,肯定要上主席树辣!!

如果打算用主席树做这道题的话,这道题就是一个主席树的纯板子问题了。。。

相当于查询区间l-r中1-x的数字的个数

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
struct node{
    int lson,rson,w;
}t[N<<5];
int rt[N],cnt;
inline void insert(int &now,int pas,int l,int r,int x){
    now=++cnt;
    t[now]=t[pas];
    ++t[now].w;
    if(l==r){
        return;
    }
    int mid=(l+r)>>1;
    if(x<=mid){
        insert(t[now].lson,t[pas].lson,l,mid,x);
    }else{
        insert(t[now].rson,t[pas].rson,mid+1,r,x);
    }
}
inline int find(int now,int pas,int l,int r,int lc,int rc){
    if(lc<=l&&r<=rc){
        return t[now].w-t[pas].w;
    }
    int mid=(l+r)>>1,res=0;
    if(lc<=mid){
        res+=find(t[now].lson,t[pas].lson,l,mid,lc,rc);
    }
    if(rc>mid){
        res+=find(t[now].rson,t[pas].rson,mid+1,r,lc,rc);
    }
    return res;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
        int x;
        scanf("%d",&x);
        insert(rt[i],rt[i-1],1,1e5,x);
    }
    while(m--){
        int l,r,x;
        scanf("%d%d%d",&l,&r,&x);
        printf("%d\n",find(rt[r],rt[l-1],1,1e5,1,x));
    }
    return 0;
}
全部评论

相关推荐

11-13 11:25
吉林大学 Java
点赞 评论 收藏
分享
🎓学历背景:双非土木硕👨‍💻意向职位:AI应用开发大佬们可以帮我看看简历吗,秋招至今0offer
秋招结束再玩瓦:今年科班都不好找哇……你可以试试交叉岗,比如制造业国企的一些开发算法,或者互联网的边缘岗,it技术支持,运维这些
我的简历长这样
点赞 评论 收藏
分享
哇哇的菜鸡oc:他这不叫校招offer,而是实习offer
点赞 评论 收藏
分享
11-15 13:12
已编辑
门头沟学院 Java
斯卡蒂味的鱼汤:知道你不会来数马,就不捞你😂最近数马疯狂扩招,招聘要求挺低的,你能力肯定够,应该就是因为太强了,知道你不会来才不捞你
投递腾讯云智研发等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务